我有一个相当基本的设置,其中包含一个UINavigationController和一个UITabBarController。我想以编程方式布局该navcontroller的rootViewController视图,但是当我在viewDidLoad中查看self.view.frame时,例如在横向模式下,我得到了如下结果:
1. view frame: {{20, 0}, {748, 1024}} // looks like an odd portrait mode
然后我自动旋转到竖屏模式,结果出现了这个:
2. view frame: {{0, 0}, {768, 911}}
然后当我回到横屏状态时,该框架现在是这样的:
3. view frame: {{0, 0}, {1024, 655}}
此外,自动旋转事件将在第2和第3帧值之间来回切换。
为了解决#1的问题,我目前在viewDidLoad中执行以下操作:
if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
self.view.frame = CGRectMake(0, 0, 768, 911);
} else {
self.view.frame = CGRectMake(0, 0, 1024, 655);
}
我觉得我显然漏掉了什么。为什么视图的默认框架与其自动旋转回相同方向时的框架不匹配?视图框架没有设置为初始方向吗?非常困惑......
我应该提到,上述内容中包括我笨拙的hack,都在视觉上没有改变任何东西。我有这个hack的原因是,当我将子视图布局到此视图中时,它们将基于我的期望位置,即导航栏下方的左上角。
我做错了什么?
更新:关闭视图上的所有自适应大小功能会更改结果#1:
view frame: {{0, 0}, {748, 1024}}
看起来更接近一些了,但仍然无法匹配#3。
viewDidAppear:
,我的视图才有了正确的框架。 - Mr RogersviewDidLayoutSubviews
中获取视图的frame信息。 - JonviewWillAppear
中无法使用框架,但在viewDidAppear
中可以。但是这对于初始布局来说太晚了。那么,viewDidLayoutSubviews
是应用最终框架和基于内容微调的规范最佳位置吗? - Benjohn