viewDidLoad中的帧大小错误

Ole*_*leg 33 storyboard nib ipad ios ios-simulator

可能重复:
为什么我必须在viewDidLoad中手动设置视图的框架?

我有iphone和ipad的通用应用程序,两个故事板,如果我在iphone模拟器上运行我的应用程序viewDidLoad在nib中的每个元素的每个帧是正确的.但是,如果我为ipad(模拟器)在框架中做它为零,但屏幕看起来正确.你能告诉我什么吗?谢谢.

fou*_*dry 108

这是一个非常类似的问题,ios setContentOffset无法在iPad上运行 ......我的回答与之相同:

"您不应该初始化与UI几何相关的内容viewDidLoad,因为此时未设置视图的几何图形,结果将无法预测.

... viewWillAppear:是做这些事情的正确位置,此时几何图形已设定,因此获取和设置与几何相关的属性是有意义的."

这也适用于获取与几何相关的属性.不要因为它在一种情况下而不是在另一种环境中表现正确而分散注意力......主要的一点是过早地设置/获取几何属性会产生不可预测的结果.

您的屏幕看起来正确,因为您 viewWillAppear:/看到了结果viewDidAppear:.

更新(ios6)

在ios6中使用autolayout时,在布局子视图之前不会设置帧.在这些条件下获取帧数据的正确位置在viewController方法中viewDidLayoutSubviews.

这被称为 viewWillAppear:.但要小心 - 他们并不总是被召集在一起.例如,viewDidLayoutSubviews在旋转后调用,viewWillAppear:则不是.viewWillAppear:每次视图成为可见视图时调用*,viewDidLayoutSubviews不一定(仅当视图需要中继时).

(*除非应用程序背景并且正在成为前台应用程序,否则viewWillAppear:不会被调用)

  • 警告:如果未启用autolayout,则不会在自动旋转时调用"viewDidLayoutSubviews".整个自动布局与非自动布局非常不兼容(您实际上必须更改源代码.唉) (2认同)

Ole*_*leg 7

我弄清楚它为什么会发生.我正在使用AutoLayout.当我在故事板中取消选中它时,框架是正确的.

  • ios6中的新功能...如果您使用autolayout,则在我们的视图布局之前不会设置帧...因此,如果您需要检查/获取帧,请在-viewDidLayoutSubviews中执行. (7认同)