35

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

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

4

2 回答 2

110

这是一个与ios setContentOffset not working on iPad非常相似的问题......我的答案与那里相同:

“你不应该在 中初始化 UI 几何相关的东西viewDidLoad,因为此时你的视图的几何没有设置,结果将是不可预测的。

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

这也适用于获取几何相关的属性。不要因为它在一种情况下的正确行为而不是在另一种情况下的行为而分心……主要的一点是,过早设置/获取几何属性会产生不可预测的结果。

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

更新 (ios6)

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

这是在 之后 viewWillAppear:调用的。但请注意 - 他们并不总是被召集在一起。例如,viewDidLayoutSubviews是在轮换之后调用的,viewWillAppear:不是。viewWillAppear:每次视图变为可见视图*时都会调用,viewDidLayoutSubviews不一定(仅当视图需要中继时)。

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

于 2012-12-28T04:43:11.983 回答
7

我明白了为什么会这样。我正在使用自动布局。当我在情节提要中取消选中它时,框架是正确的。

于 2012-12-28T08:10:18.507 回答