Ответ 1
Есть несколько вещей, которые вы не понимаете.
Сначала система отправляет вам viewDidLoad
сразу после загрузки вашего пива. Он еще не добавил представления в иерархию представлений. Таким образом, он не изменил размер вашего представления на основе поворота устройства.
Во-вторых, рамка представления находится в координатном пространстве наблюдения. Если это ваш корневой вид, его супервизор будет UIWindow
(как только система фактически добавит ваше представление в иерархию представлений). UIWindow
обрабатывает вращение, устанавливая преобразование его подсмотра. Это означает, что рамка просмотра не обязательно будет тем, что вы ожидаете.
Здесь иерархия представлений в портретной ориентации:
(lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $1 = 0x09532dc0 <UIWindow: 0x9632900; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x96329f0>>
| <UIView: 0x9634ee0; frame = (0 20; 768 1004); autoresize = W+H; layer = <CALayer: 0x9633b50>>
и здесь иерархия представлений в горизонтальной ориентации:
(lldb) po [[UIApp keyWindow] recursiveDescription]
(id) $2 = 0x09635e70 <UIWindow: 0x9632900; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0x96329f0>>
| <UIView: 0x9634ee0; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x9633b50>>
Обратите внимание, что в альбомной ориентации размер кадра составляет 748 x 1024, а не 1024 x 748.
То, что вы, вероятно, хотите посмотреть, если это ваш корневой вид, - это границы вида:
(lldb) p (CGRect)[0x9634ee0 bounds]
(CGRect) $3 = {
(CGPoint) origin = {
(CGFloat) x = 0
(CGFloat) y = 0
}
(CGSize) size = {
(CGFloat) width = 1024
(CGFloat) height = 748
}
}
Предположительно, вы хотите узнать, когда обновится преобразование вида, рамки и границы. Если интерфейс находится в альбомной ориентации, когда ваш контроллер просмотра загружает свое представление, вы получите сообщения в следующем порядке:
{{0, 0}, {768, 1004}} viewDidLoad
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} viewWillAppear:
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {768, 1004}} willRotateToInterfaceOrientation:duration:
{{0, 0}, {1024, 748}} viewWillLayoutSubviews
{{0, 0}, {1024, 748}} layoutSubviews
{{0, 0}, {1024, 748}} viewDidLayoutSubviews
{{0, 0}, {1024, 748}} willAnimateRotationToInterfaceOrientation:duration:
{{0, 0}, {1024, 748}} shouldAutorotateToInterfaceOrientation:
{{0, 0}, {1024, 748}} viewDidAppear:
Вы можете видеть, что ваши ограничения обзора меняются после получения willRotateToInterfaceOrientation:duration:
и до получения viewWillLayoutSubviews
.
Методы viewWillLayoutSubviews
и viewDidLayoutSubviews
новы для iOS 5.0.
Сообщение layoutSubviews
отправляется на просмотр, а не на контроллер представления, поэтому вам нужно будет создать пользовательский подкласс UIView
, если вы хотите его использовать.