iOS 自动布局总结篇
2018-01-11 本文已影响586人
人魔七七
前几篇已经讲述了代码 SB/xib 设置自动布局,并且介绍了几个特殊的例子。现在总结下。
自动布局的生命周期:
借用一张图介绍
![](https://img.haomeiwen.com/i1304277/d8c51da5bf16c318.png)
一一说明:Constraints Change Deferred Layout Pass
Constraints Change
约束的改变主要有下面几点引起:
1:激活或者相反的状态
2:改变约束的值
3:改变约束的优先级
4:改变View视图层的结构比如移除掉一个View或者改变层次
5:其他的比如改变一个控件的属性
Deferred Layout Pass
![](https://img.haomeiwen.com/i1304277/f3c42c0b3478e83e.png)
主要下面两个过程
1:系统遍历View的层级结构并且调用所有控制器的updateViewConstraint方法或者所有的View的updateConstraint方法。然后你可以重写这个方法来自定义自己的约束。
![](https://img.haomeiwen.com/i1304277/5b0fef87db300ad1.png)
2:系统遍历View的层级结构调用所有控制器的ViewWillLayoutSubviews或者所有View的layoutSubViews。默认的layoutSubViews方法更新每个View的frame通过自动布局。你可以通过重写一些方法更改布局,这就是自定义布局的实现方式,注意为什么开始结束都要调用父类方法。
![](https://img.haomeiwen.com/i1304277/0b139c37df7f572e.png)
注意:不要直接调用,通过其他方法触发,调用setNeedsLayout 方法或者 setNeedsUpdateConstraints方法。
![](https://img.haomeiwen.com/i1304277/a690d0666d5e365a.png)
举个例子
![](https://img.haomeiwen.com/i1304277/714696e482a446e9.png)
其实通过setNeedsUpdateConstraints 触发,是批处理的一个表现,因为性能原因我们需要批量更新。他会标记约束,并且布局引擎将要重新在下一个循环中计算约束并调用updateConstraints方法去改变约束,注意一点最后要调用父类方法的实现,[super updateConstraints ]。
setNeedsLayout 有时候你改变了一些布局,系统不能自己标记这个布局,你又不能自己直接访问这个布局的flag,这是你就要调用这个方法标记下这个布局,然后会在在下一个布局循环中重新计算稍后会调用layoutSubViews方法。注意你必须调用父类方法[super layoutSubViews]如果你要对frame有要求的话。
有时候需要马上更新约束布局
比如你做动画的时候需要立即更新约束布局
![](https://img.haomeiwen.com/i1304277/7f5fa02cfa8288a7.png)
![](https://img.haomeiwen.com/i1304277/9155a8c8b95bfb5a.png)
最后总结一张图:
![](https://img.haomeiwen.com/i1304277/da1e29dfea49def8.png)