AutoLayout

一般来说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{}

你可能感兴趣的:(AutoLayout)