可能重复:
为什么我必须在viewDidLoad中手动设置视图的框架?
我有适用于iphone和ipad的通用应用程序,两个故事板,如果我在viewDidLoad
中的iphone模拟器上运行我的应用程序,那么nib中每个元素的每一帧都是正确的。但如果我为ipad(模拟器(做这件事,画面为零,但屏幕看起来是正确的。你能告诉我smth吗?谢谢
这是一个与ios setContentOffset在iPad上不工作非常相似的问题。。。我的答案和那里一样:
"您不应该在viewDidLoad
中初始化与UI几何图形相关的内容,因为此时视图的几何图形尚未设置,结果将是不可预测的。
viewWillAppear:
是执行这些操作的正确位置,此时已设置几何体,因此获取和设置与几何体相关的属性是有意义的。">
这也适用于获取几何体相关属性。不要因为它在一种情况下表现正确而分心。。。主要的一点是过早地设置/获取几何体属性将产生不可预测的结果。
您的屏幕看起来正确,因为您在viewWillAppear:
/viewDidAppear:
之后看到结果。
更新(ios6(
在ios6中使用自动布局时,在布局子视图之前不会设置框架。在这些条件下,获取帧数据的正确位置是在viewController方法viewDidLayoutSubviews
中。
这在viewWillAppear:
之后被称为。但要小心——他们并不总是被召集在一起。例如,在旋转之后调用viewDidLayoutSubviews
,而不调用viewWillAppear:
。每当视图变为可见视图时调用viewWillAppear:
,viewDidLayoutSubviews
不一定(仅当视图需要中继时(。
(*除非应用程序是后台应用程序,并且正在成为前台应用程序,否则不会调用viewWillAppear:
(
我弄清楚了为什么会发生这种事。我在使用AutoLayout。当我在情节提要中取消选中它时,框架是正确的。