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