【问题标题】:wrong frame size in viewDidLoad [duplicate]viewDidLoad 中的帧大小错误 [重复]
【发布时间】:2012-12-13 03:46:58
【问题描述】:

可能重复:
Why am I having to manually set my view’s frame in viewDidLoad?

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

【问题讨论】:

  • 究竟哪一帧是零?如果可能,请提供更多细节。
  • 我现在检查每个 iboutlet 到处都有 nil 框架:viewwillappear、viewdidappear、viewdidload。
  • 基本上 viewDidLoad 是“最安全”的地方。尤其是在启动实时摄像头时,您会看到这个问题。

标签: ios ipad storyboard ios-simulator nib


【解决方案1】:

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

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

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

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

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

更新 (ios6)

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

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

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

【讨论】:

  • 我检查并在 viewWillAppear 中是一样的。所有帧都是零。暂时不知道怎么解释。
  • 警告:如果未启用自动布局,则不会在自动旋转时调用“viewDidLayoutSubviews”。整个自动布局与非自动布局在很大程度上不兼容(您实际上必须更改源代码。呃)
  • @Adam,我同意 - 自动布局大多没有用,并且与非自动布局的工作方式非常不兼容。最糟糕的是,它在 Interface Builder 中默认为 ON,导致在 SO 上出现大量不必要的问题和答案。请注意,我的这部分答案是针对那些勾选了复选框的人...
  • 此外,正如文档所述,调用此方法并不表示视图子视图的各个布局已被调整。因此,如果您依赖通过 AutoLayout 设置的特定子视图的大小,您可能需要调用 setNeedsLayoutlayoutIfNeeded
【解决方案2】:

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

【讨论】:

  • ios6 中的新功能...如果您使用自动布局,则在我们布置视图之前不会设置框架...因此,如果您需要检查/获取框架,请在 -viewDidLayoutSubviews 中执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 2022-12-04
  • 2018-10-23
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多