"Неправильный" размер рамки / окна после переориентации в iPhone

В моем приложении для iPhone OS я хочу (нужно) следить за изменениями в ориентации устройства, чтобы переставить определенные части экрана. Подход, который я использовал, состоял в том, чтобы использовать CGRect frame = [UIScreen mainScreen].applicationFrame чтобы получить размер экрана, и оттуда рассчитать размер и / или расположение других элементов управления (я также пытался self.view.frame).

До сих пор все тестирование проводилось в портретном режиме, поэтому я мог сосредоточиться на программировании основных функций, а затем просто внести некоторые изменения в альбомную ориентацию. И тут возникает проблема: в -(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation Я добавил некоторые записи в журнал, чтобы проверить размеры, прежде чем продолжить, но, очевидно, значения Width и Height являются "неправильными" (я говорю "неправильные", потому что на первый взгляд значения не имеют смысла для меня).

Вот вывод некоторых журналов:

  • Вращение: Пейзаж [w=300.000000, h=480.000000]
  • Вращение: Портрет [w=320.000000, h=460.000000]

Значения "w" и "h" в альбомной ориентации кажутся мне инвертированными - я ожидал, что w=480 и h=300.

Что я делаю неправильно? Код, который я использовал для отладки, приведен ниже.

-(void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    CGRect frame = [UIScreen mainScreen].applicationFrame;
    CGSize size = frame.size;

    NSLog(@"%@", [NSString stringWithFormat:@"Rotation: %s [w=%f, h=%f]",  
        UIInterfaceOrientationIsPortrait(self.interfaceOrientation) ? "Portrait" : "Landscape",
        size.width, size.height]);
}

3 ответа

Решение

Изменилась ориентация вашего устройства, а не физические характеристики экрана. Вы в основном наклонили его на бок, но на самом деле он имеет ширину 320 пикселей (20 из которых недоступны на данный момент, так как отображается строка состояния) и высоту 480 пикселей. Если ваш вид автоматически вращается, то ширина / высота были переведены для вас, но когда вы запрашиваете фактические размеры экрана, вы возвращаете фактические размеры экрана.

По этой же причине при работе с переведенными видами важно выполнять вычисления на основе центра вида и границ вида, а не на его раме.

Использование self.view.bounds вместо.

Я спотыкался о той же проблеме, и с некоторыми диагностическими работами я обнаружил, что границы и рамка вида не точно отражают альбомную ориентацию в viewDidLoad (когда устройство удерживается в горизонтальной плоскости, когда контроллер представления помещается в стек), но делать это правильно в viewWillAppear: а также viewDidAppear:, Я просто переместил свой код, который нуждался в размерах рамки / границ из viewDidLoad в viewWillAppear:и это сработало правильно.

Другие вопросы по тегам