一般来说layoutSubviews负责布局,比如调整View之间的距离,大小,drawRect负责绘制,比如使用什么颜色。而AutoLayout则是在layout之前增加了一个设定约束的过程,也就是update constraints。
约束方法
/*
* 当一个自定义view的某个属性发生改变,并且可能影响到constraint时
* 需要调用此方法去标记constraints需要在未来的某个点更新
* 系统然后调用updateConstraints
*/
- (void)setNeedsUpdateConstraints{}
/*
* 系统在需要时,立即出发约束更新,自动更新布局
*/
- (void)updateConstraintsIfNeeded{}
/*
* 自定义view应该重写此方法,在其中建立constraints
* 要的实现的最后调用 [super updateConstraints]
*/
- (void)updateConstraints{}
自动布局过程
updateConstraints -> layout -> display
updating constrains
*测量阶段:from subview to super view , 为下一步layout做准备。
可以通过setNeedUpdateConstraints触发此步。constraints的改变也会自动触发此步。
最后会触发- (void)updateConstraints{};所有设置的constraints最终还是走此方法,可以在此方法中最后更改constraints
layout
*布局阶段:from super view to subview ,根据上一步的信息去设置view的center和bounds。
可以通过setNeedsLayout去触发此步,此方法不会立即更新layout
可以通过layoutIfNeeded 立即更新layout
最后会调用layoutSubViews方法。
display
*渲染、展示阶段:from super view to subview
通过调用setNeedsDisplay触发
不使用自动布局
//
- (void)layoutSubviews{}
// 标记为需要从新布局,异步调用layoutIfNeeded刷新布局,
// 不立即刷新,但layoutSubviews一定会被调用
- (void)setNeedsLayout{}
// 有需要刷新标记时,立即调用layoutSubviews进行布局
// 如果没有标记,不会调用layoutSubviews
- (void)layoutIfNeeded{}