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.size 在同一方向改变值

为什么self.view.frame和self.view.bounds在设备旋转时有所不同?

iOS 7 状态栏和 self.view.frame 和 self.view.bounds

CGRect.offsetBy 不工​​作