iPhone правильные координаты ландшафтного окна - PullRequest
8 голосов
/ 17 мая 2011

Я пытаюсь получить координаты окна представления таблицы, используя следующий код:

[self.tableView.superview convertRect:self.tableView.frame toView:nil]

Он сообщает правильные координаты в портретном режиме, но когда я поворачиваюсь вландшафт больше не сообщает правильные координаты.Во-первых, он переворачивает координаты x, y, а также ширину и высоту.Это не совсем проблема, хотя.Настоящая проблема в том, что координаты неверны.В портретном режиме координаты окна для фрейма табличного представления: {{0, 114}, {320, 322}}, в то время как в альбомном режиме координаты окна: {{32, 0}, {204, 480}}.Очевидно, что значение x здесь неверно, верно?Разве это не должно быть 84?Я ищу решение этой проблемы, и если кто-нибудь знает, как получить правильные оконные координаты вида в ландшафтном режиме, я был бы очень признателен, если бы вы поделились этими знаниями со мной.

Вот несколько снимков экрана, на которых вы можете видеть макет вида.

Портрет: http://i.stack.imgur.com/IaKJc.png

Пейзаж: http://i.stack.imgur.com/JHUV6.png

Ответы [ 5 ]

6 голосов
/ 19 июля 2011

Я нашел то, что я считаю началом решения.Кажется, что координаты, которые мы с вами видим, основаны на нижнем левом или верхнем правом углу, в зависимости от того, является ли ориентация UIInterfaceOrientationLandscapeRight или UIInterfaceOrientationLandscapeLeft.

Я пока не знаю почему, но, надеюсь, это поможет.:)

[ОБНОВЛЕНИЕ] Итак, я предполагаю, что в обычном портретном режиме источник окна равен 0,0 и вращается вместе с ipad / iphone.

Так вот, как я решил это.

Сначала я беру свою ориентацию, границы окна и прямоугольник моего обзора в окне (со странными координатами)

UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
CGRect windowRect = appDelegate.window.bounds;
CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:nil];

Затем, если ориентация является альбомной, я изменяю координаты x и yкоординаты, ширина и высота

if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation ) {
    windowRect = XYWidthHeightRectSwap(windowRect);
    viewRectAbsolute = XYWidthHeightRectSwap(viewRectAbsolute);
}

Затем я вызываю свою функцию для фиксации начала координат, основываясь на верхнем левом углу независимо от поворота ipad / iphone.Он фиксирует происхождение в зависимости от того, где в данный момент проживает 0,0 (в зависимости от ориентации)

viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height);

Вот две функции, которые я использую

CGRect XYWidthHeightRectSwap(CGRect rect) {
    CGRect newRect;
    newRect.origin.x = rect.origin.y;
    newRect.origin.y = rect.origin.x;
    newRect.size.width = rect.size.height;
    newRect.size.height = rect.size.width;
    return newRect;
}

CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) {
    CGRect newRect;
    switch(orientation)
    {
        case UIInterfaceOrientationLandscapeLeft:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationPortrait:
            newRect = rect;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
    }
    return newRect;
}
3 голосов
/ 04 февраля 2014

Это хак, но у меня работает:

UIView *toView = [UIApplication sharedApplication].keyWindow.rootViewController.view;
[self.tableView convertRect:self.tableView.bounds toView:toView];

Я не уверен, что это лучшее решение. Это может работать не надежно, если ваш корневой контроллер вида не поддерживает ту же ориентацию, что и текущий контроллер представления.

0 голосов
/ 24 января 2012

Попробуйте границы вместо кадра self.parentViewController.view.bounds потому что это дает мне скорректированные координаты в соответствии с текущей ориентацией

0 голосов
/ 18 мая 2011

Ваш код должен быть:

[tableView convertRect:tableView.bounds toView:[UIApplication sharedApplication].keyWindow];

Это даст вам прямоугольник вида в системе координат окна.Обязательно используйте «границы», а не «кадр».frame - это уже прямоугольник представления в его системе координат родительского представления."bounds" - это прямоугольник вида в своей собственной системе.Таким образом, приведенный выше код просит табличное представление преобразовать свой прямоугольник из своей системы в систему окна.Ваш предыдущий код просил родительское представление таблицы преобразовать прямоугольник таблицы из родительской системы координат в ничто.

0 голосов
/ 17 мая 2011

Вы должны иметь возможность получить текущие координаты табличного представления из self.tableView.bounds

...