一般來說layoutSubviews負(fù)責(zé)布局,比如調(diào)整View之間的距離,大小缸沃,drawRect負(fù)責(zé)繪制,比如使用什么顏色修械。而AutoLayout則是在layout之前增加了一個設(shè)定約束的過程,也就是update constraints趾牧。
約束方法
/*
* 當(dāng)一個自定義view的某個屬性發(fā)生改變,并且可能影響到constraint時
* 需要調(diào)用此方法去標(biāo)記constraints需要在未來的某個點更新
* 系統(tǒng)然后調(diào)用updateConstraints
*/
- (void)setNeedsUpdateConstraints{}
/*
* 系統(tǒng)在需要時肯污,立即出發(fā)約束更新翘单,自動更新布局
*/
- (void)updateConstraintsIfNeeded{}
/*
* 自定義view應(yīng)該重寫此方法梯皿,在其中建立constraints
* 要的實現(xiàn)的最后調(diào)用 [super updateConstraints]
*/
- (void)updateConstraints{}
自動布局過程
updateConstraints -> layout -> display
updating constrains
*測量階段:from subview to super view , 為下一步layout做準(zhǔn)備。
可以通過setNeedUpdateConstraints觸發(fā)此步县恕。constraints的改變也會自動觸發(fā)此步东羹。
最后會觸發(fā)- (void)updateConstraints{};所有設(shè)置的constraints最終還是走此方法忠烛,可以在此方法中最后更改constraints
layout
*布局階段:from super view to subview 属提,根據(jù)上一步的信息去設(shè)置view的center和bounds。
可以通過setNeedsLayout去觸發(fā)此步美尸,此方法不會立即更新layout
可以通過layoutIfNeeded 立即更新layout
最后會調(diào)用layoutSubViews方法冤议。
display
*渲染、展示階段:from super view to subview
通過調(diào)用setNeedsDisplay觸發(fā)
不使用自動布局
//
- (void)layoutSubviews{}
// 標(biāo)記為需要從新布局师坎,異步調(diào)用layoutIfNeeded刷新布局恕酸,
// 不立即刷新,但layoutSubviews一定會被調(diào)用
- (void)setNeedsLayout{}
// 有需要刷新標(biāo)記時胯陋,立即調(diào)用layoutSubviews進(jìn)行布局
// 如果沒有標(biāo)記蕊温,不會調(diào)用layoutSubviews
- (void)layoutIfNeeded{}