有几件事你不明白。
首先,系统会在加载您的笔尖后立即向您发送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 子类。