self.view.frame неожиданно изменил размер в ландшафтном режиме

Я установил представление контроллера представления через IB. Вид настроен на альбомный с шириной 480 и высотой 320. Он правильно загружен в симуляторе. Однако, когда я проверил self.frame.size с помощью NSLog, я обнаружил, что размер кадра изменился сам без поворота устройства или какого-либо кода. Вот что я получаю:

В viewDidLoad -> size = 480 x 320

В viewWillAppear -> size = 480 x 320

В viewDidAppear -> размер = 320 x 480

У меня есть коды только в viewDidLoad, но нет viewWillAppear или viewDidAppear. Кто-нибудь знает, что произошло за кулисами? Спасибо.


person Anthony    schedule 21.08.2010    source источник
comment
В ландшафтном режиме я записываю 3 вышеуказанных метода, и все они говорят, что кадр 320x480, только в viewDidAppear преобразование (0, -1, 1, 0, 0, 0)   -  person onmyway133    schedule 07.05.2014


Ответы (1)


Попробуйте что-то вроде этого:

NSLog("frame=%@ transform=%@", NSStringFromCGRect(self.frame), NSStringFromCGAffineTransform(self.transform));

Я готов поспорить, что преобразование - это идентичность (1,0,0,1,0,0), когда размер кадра составляет 480x320, и поворот на 90 (0,1, -1,0,0,0 или 0, -1,1,0,0,0) при размере кадра 320х480.

Что происходит?

Ну, viewDidLoad (и я думаю, что viewWillAppear) вызывается перед добавлением представления в иерархию представлений. Когда он добавляется в иерархию, UIKit также устанавливает преобразование представления, что и происходит при вращении.

Но почему это меняет рамку?

Что ж, «фрейм» относится к родительскому представлению, которым является UIWindow. Окно не вращается; представление контроллера представления делает. С точки зрения окна все эффективно в портретном режиме.

Вы, вероятно, захотите self.view.bounds.

person tc.    schedule 21.08.2010
comment
Отличное объяснение! Это первый раз, когда это имело для меня смысл :) - person Jens Willy Johannsen; 25.01.2012