viewDidLoad
我在/中设置了约束loadView
(我的目标是 iOS >= 6)。updateViewConstraints
对于更改约束值很有用,例如,如果某些约束取决于屏幕的方向(我知道,这是一种不好的做法),您可以constant
在此方法中更改它。
从 39:22 开始,在“iOS 和 OS X 的自动布局简介”viewDidLoad
(WWDC 2012)会话中显示了添加约束。我认为这是在讲座中说的但没有出现在文档中的事情之一。
更新:我注意到在 View Controllers 的资源管理中设置约束的提及:
如果您更喜欢以编程方式创建视图,而不是使用情节提要,则可以通过覆盖视图控制器的loadView
方法来实现。您对此方法的实现应执行以下操作:
(...)
3.如果您使用自动布局,请为您刚刚创建的每个视图分配足够的约束来控制视图的位置和大小。否则,实现viewWillLayoutSubviews
和
viewDidLayoutSubviews
方法来调整视图层次结构中子视图的框架。请参阅“调整视图控制器的视图大小”。</p>
更新 2:在 WWDC 2015 期间,Apple给出了新的解释和推荐用法:updateConstraints
updateViewConstraints
确实,所有这些都是视图有机会在下一次布局传递时及时更改约束的一种方式,但实际上通常不需要。
理想情况下,所有初始约束设置都应该在 Interface Builder 中进行。
或者如果你真的发现你需要以编程方式分配你的约束,像 viewDidLoad 这样的地方会好得多。
更新约束实际上只适用于需要定期重复的工作。
此外,当您发现需要这样做时,只需更改约束也非常简单;然而,如果您将该逻辑与与其相关的其他代码分开并将其移动到稍后执行的单独方法中,您的代码将变得更难遵循,因此您将更难维护,其他人会更难理解。
那么什么时候需要使用更新约束呢?
好吧,归结为性能。
如果您发现仅在适当位置更改约束太慢,那么更新约束可能会帮助您。
事实证明,在更新约束中更改约束实际上比在其他时间更改约束要快。
这样做的原因是因为引擎能够将在此通道中发生的所有约束更改视为批处理。