Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

[self convertPoint:CGPointZero toView:theWindow];

Ответ 3

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

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

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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

Ответ 4

Swift:

В 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)")