«Неправильный» размер рамки / окна после переориентации в iPhone - PullRequest
38 голосов
/ 22 апреля 2010

В моем приложении для 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 ]

33 голосов
/ 22 апреля 2010

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

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

27 голосов
/ 11 апреля 2012

Используйте self.view.bounds вместо.

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

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

...