"Неправильный" размер рамки / окна после переориентации в 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 пикселей. Если ваш вид автоматически вращается, то ширина / высота были переведены для вас, но когда вы запрашиваете фактические размеры экрана, вы возвращаете фактические размеры экрана.
По этой же причине при работе с переведенными видами важно выполнять вычисления на основе центра вида и границ вида, а не на его раме.
Я спотыкался о той же проблеме, и с некоторыми диагностическими работами я обнаружил, что границы и рамка вида не точно отражают альбомную ориентацию в viewDidLoad
(когда устройство удерживается в горизонтальной плоскости, когда контроллер представления помещается в стек), но делать это правильно в viewWillAppear:
а также viewDidAppear:
, Я просто переместил свой код, который нуждался в размерах рамки / границ из viewDidLoad
в viewWillAppear:
и это сработало правильно.