可能重复:
Why am I having to manually set my view’s frame in viewDidLoad?
我有iphone和ipad的通用应用程序,两个故事板,如果我在viewDidLoad
的iphone模拟器上运行我的应用程序nib中每个元素的每一帧都是正确的。但是,如果我为ipad(模拟器)在框架中做它为零,但屏幕看起来正确。你能告诉我什么吗?感谢。
答案 0 :(得分:107)
这是一个与ios setContentOffset not working on iPad非常相似的问题......我的答案与那里的答案相同:
“您不应该在viewDidLoad
中初始化与UI几何相关的内容,因为此时未设置视图的几何图形,结果将无法预测。
... viewWillAppear:
是做这些事情的正确位置,此时几何图形已设置,因此获取和设置与几何相关的属性是有意义的。“
这也适用于获取几何相关的属性。不要因为它在一种情况下而不是在另一种环境中表现正常而分散注意力......主要的一点是过早地设置/获取几何属性会产生不可预测的结果。
您的屏幕看起来正确,因为您在 viewWillAppear:
/ viewDidAppear:
之后看到了结果。
更新(ios6)
在ios6中使用自动布局时,在布置子视图之前不会设置帧。在这些条件下获取帧数据的正确位置在viewController方法viewDidLayoutSubviews
中。
在 viewWillAppear:
之后称为。但要小心 - 他们并不总是被召集在一起。例如,viewDidLayoutSubviews
在轮换后调用,viewWillAppear:
不是。每次视图成为可见视图*时都会调用viewWillAppear:
,viewDidLayoutSubviews
不一定(仅当视图需要中继时)。
(*除非应用程序已成为后台应用程序并且正在成为前台应用程序,否则不会调用viewWillAppear:
)
答案 1 :(得分:7)
我弄明白为什么会这样。我正在使用AutoLayout。当我在故事板中取消选中它时,框架是正确的。