图17-1 约束方程式
img下列所有行为都会改变一个或多个约束:
- 激活或失效约束
- 修改约束的常数值(constant value)
- 修改约束的优先级
- 从视图层级中移除视图
延迟布局阶段(The Deferred Layout Pass)
为了避免直接更新受影响视图的frame,Auto Layout设置了一个稍后执行的布局阶段。此延迟阶段首先更新布局的约束,之后为视图层级中的所有视图计算frame。
视图层级中的延迟布局阶段通常由两个阶段组成:
- 如果需要,在更新阶段(Update Pass)更新约束
- 如果需要,在布局阶段(Layout Pass)重设视图的frame
更新阶段
布局阶段
分阶段修改(Batching Changes)
在有影响的修改发生后,直接更新约束应该总是最简洁、最方便的方式。将这些修改延迟到之后的方法中执行,会使代码更加复杂并难以理解。
可是,总有一些时候你想要为了优化性能而进行分阶段的修改。如当修改约束的地方执行太慢,或是视图正在进行许多冗余修改时,使用这种方式便可以解决。
说明
自定义布局(Custom Layouts)
重点
在覆盖这些方法时,布局正处在一个不确定的状态。一部分视图可能已经布局完,另一部分则没有。在修改视图层级时,你需要非常小心,否则很可能就会导致调用循环。如下规则可以帮助你避免调用循环:
- 你必须在方法的某处调用父类的实现。
- 你可以安全地在子树中让视图布局无效化;可是,你必须在调用父类的实现之前做这件事。
- 不要让在子树外的任何视图布局无效化。这会导致调用循环。
- 不要调用。你刚刚完成了一次更新阶段。调用此方法会产生一个调用循环。
- 不要调用。调用此方法会产生一个调用循环。
- 修改约束时要格外小心。你不能意外地让子树外的视图布局无效化。