Преобразование исходной точки UIView в систему координат окна.

Я хочу получить начало scrollView в системе координат окна. Например, в настоящее время происхождение scollView равно (0,51). Но в системе координат окна это должно быть 51 + 44 (высота панели навигации) + 20 (высота строки состояния) = 115. Значит, в системе координат окна scrollView.frame.origin должно быть (0,115). Я пытался использовать convertPoint: методы, но иногда получал (0,51) или (0,0). Пожалуйста, предоставьте решение этой проблемы. Спасибо


person Nishit    schedule 10.07.2010    source источник
comment
Версия Swift внизу   -  person Juan Boero    schedule 23.11.2015


Ответы (4)


Похоже, вы не конвертируете между правильными представлениями. Кадр представления устанавливается в координаты его супервизора, а не его собственные внутренние координаты, поэтому, если вы пытаетесь преобразовать источник представления в координаты окна, вам нужно будет использовать супервизор:

[[self superview] convertPoint:self.frame.origin toView:theWindow];

Однако еще проще преобразовать нулевую точку из самого вида в окно. Два фрагмента кода эквивалентны, поэтому вообще нет необходимости использовать источник.

[self convertPoint:CGPointZero toView:theWindow];
person TechZen    schedule 10.07.2010
comment
Я попробовал этот фрагмент кода в методе viewDidLoad, заменив self на self.view и theWindow на self.view.window, но он дает (0,0) в качестве вывода - person Nishit; 10.07.2010
comment
Я бы проверил, что свойство окна представления не равно нулю. Это часто так. - person TechZen; 10.07.2010
comment
Спасибо за ответ. Как справиться с этой проблемой. Я попытался заменить self.view.window на [UIApplication sharedApplication].keywindow, но безрезультатно. - person Nishit; 11.07.2010
comment
@Nishit, вы должны попробовать это в viewDidAppear, в элементах viewDidLoad еще нет слоев ... - person Juan Boero; 23.11.2015

Я пробовал использовать решение TechZen, но безрезультатно. Вместо преобразования источника scrollView я сослался на справочник класса UIWindow в документах Apple и преобразовал endCenter клавиатуры в систему координат моего представления, используя этот код [self.view convertPoint:endCentre fromView:[UIApplication sharedApplication].keyWindow]. Этот фрагмент кода работал и, следовательно, решил мою проблему. Однако все еще остается вопрос, почему он не дает правильную координату scrollView.origin. Итак, в основном я нашел обходной путь, преобразовав endcenter клавиатуры вместо scrollView.origin. О, и я делал все это, чтобы вычислить новую высоту моего scrollView, когда клавиатура появляется на экране. Итак, если у кого-то есть решение этой проблемы или любое лучшее решение, пожалуйста, сообщите нам всем.

person Nishit    schedule 11.07.2010
comment
есть какое-нибудь решение›? у меня такая же проблема - person Jasmeet; 30.06.2014

Обратите внимание, что эти функции будут работать только после того, как контроллер представления завершит размещение подвидов. Поэтому, если вы хотите, чтобы при загрузке просмотра вы могли использовать viewDidLayoutSubviews/viewDidAppear, но не в viewDidLoad/viewWillAppear и т. д.

Этот код работал для меня:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView];
}
person david72    schedule 19.05.2015

Свифт:

В viewDidAppear (иначе элементы еще не разделены) вашего ViewController:

        var yourFrame = yourScrollView.convertRect(yourScrollView.frame, to: self.view)

        //PRINT THE WHOLE RECT
        print(yourFrame)

        //PRINT A DETAILED VERSION OF THE FRAME, ALSO CAN PERFORM CALCULATION BETWEEN THE RECT PARAMETERS TO GET , FOR EXAMPLE, WIDTH POINT IN THE SUPERVIEW:
        print("X: \(yourFrame.origin.x) Y: \(yourFrame.origin.y) WIDTH: \(yourFrame.width) HEIGHT: \(yourFrame.height)")
person Juan Boero    schedule 23.11.2015
comment
В Swift 3: var yourFrame = yourScrollView.convertRect(yourScrollView.frame, to: self.view) - person Medhi; 26.10.2016