Преобразовать исходную точку UIView в ее оконную систему координат - PullRequest
29 голосов
/ 10 июля 2010

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

Ответы [ 4 ]

55 голосов
/ 10 июля 2010

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

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

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

[self convertPoint:CGPointZero toView:theWindow];
10 голосов
/ 11 июля 2010

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

6 голосов
/ 19 мая 2015

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

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

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGPoint originInSuperview = [self.view.superview convertPoint:CGPointZero fromView:self.scrollView];
}
2 голосов
/ 23 ноября 2015

Swift 2.1:

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

        var yourFrame = yourScrollView.convertRect(yourScrollView.frame, toView: 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)")
...