Есть пара вещей, которые вы не понимаете.
Во-первых, система отправляет вам 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
, если вы хотите его использовать.