«Неверный» размер кадра / windows после переориентации в iPhone

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

Все тесты были выполнены до сих пор в режиме «Портрет», поэтому я мог сосредоточиться на программировании основных функций, а затем просто внести некоторые изменения в «Пейзаж». И здесь возникает проблема: In -(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]); } 

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

Именно поэтому при работе с переведенными представлениями важно выполнять вычисления на основе центра представления и границ представления и никогда не быть в кадре представления.

self.view.bounds этого используйте self.view.bounds .

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

  • Изменить размер для строки состояния вызова?
  • Простой способ изменить положение UIView?
  • iOS - нажимать вперед все
  • Рамка UIView, границы, центр, происхождение, когда использовать что?
  • анимация addSubview
  • UIView animateWithDuration не изменяет параметр cornerRadius
  • Подclass UIView со своим XIB
  • Как настроить размер содержимого UIScrollView динамически
  • Как сделать круговой UIView
  • Переходы iPhone Curl Left и Curl Right
  • Разница между addSubview и insertSubview в classе UIView
  • Давайте будем гением компьютера.