self.view.frame 在横向模式下意外更改大小
Posted
技术标签:
【中文标题】self.view.frame 在横向模式下意外更改大小【英文标题】:self.view.frame changed size ifself unexpectedly in landscape mode 【发布时间】:2010-08-21 03:59:35 【问题描述】:我已经通过 IB 设置了视图控制器的视图。视图设置为横向,宽度为 480,高度为 320。它在模拟器中正确加载。但是,当我使用 NSLog 检查 self.frame.size 时,我发现帧大小会自行改变,而无需任何设备旋转或任何代码。这是我得到的:
在 viewDidLoad --> 大小 = 480 x 320
在 viewWillAppear 中 --> 大小 = 480 x 320
在 viewDidAppear --> 大小 = 320 x 480
我只有 viewDidLoad 中的代码,但没有 viewWillAppear 和 viewDidAppear。有谁知道幕后发生了什么?谢谢。
【问题讨论】:
在横向模式下,我记录了上述3个方法,都说帧320x480,只有在viewDidAppear中,变换是(0, -1, 1, 0, 0, 0) 【参考方案1】:试试这样的:
NSLog("frame=%@ transform=%@", NSStringFromCGRect(self.frame), NSStringFromCGAffineTransform(self.transform));
我敢打赌,当帧大小为 480x320 和 90° 旋转 (0,1,-1,0,0,当帧大小为 320x480 时为 0 或 0,-1,1,0,0,0)。
发生了什么事?
好吧,viewDidLoad(我认为 viewWillAppear)在视图被添加到视图层次结构之前被调用。当它被添加到层次结构中时,UIKit 也会设置视图变换,这就是旋转发生的方式。
但是为什么这会改变框架呢?
嗯,“框架”是相对于父视图,即 UIWindow。窗口不旋转;视图控制器的视图确实如此。从窗口的角度来看,一切都有效地处于纵向模式。
你可能想要 self.view.bounds。
【讨论】:
很好的解释!这是第一次这对我来说真正有意义:)以上是关于self.view.frame 在横向模式下意外更改大小的主要内容,如果未能解决你的问题,请参考以下文章
Sprite Kit 游戏:纵向模式下的世界,横向模式下的战斗?
为什么self.view.frame和self.view.bounds在设备旋转时有所不同?