AutoLayer自動佈局流程

weixin_34124651發表於2017-02-15

一,三個流程

1,更新Constraints

-setNeedsUpdateConstraints:當一個自定義view的某個屬性發生改變,並且可能影響到constraint時,需要呼叫此方法去標記constraints需要在未來的某個點更新,系統然後呼叫updateConstraints.
-needsUpdateConstraints:constraint-based layout system使用此返回值去決定是否需要呼叫updateConstraints作為正常佈局過程的一部分。
-updateConstraintsIfNeeded:立即觸發約束更新,自動更新佈局。
-updateConstraints:自定義view應該重寫此方法在其中建立constraints. 注意:要在實現在最後呼叫[super updateConstraints]

2,重新整理子物件佈局

-layoutSubviews:這個方法,預設沒有做任何事情,需要子類進行重寫
-setNeedsLayout: 標記為需要重新佈局,非同步呼叫layoutIfNeeded重新整理佈局,不立即重新整理,但layoutSubviews一定會被呼叫
-layoutIfNeeded:如果,有需要重新整理的標記,立即呼叫layoutSubviews進行佈局(如果沒有標記,不會呼叫layoutSubviews)

如果要立即重新整理,要先呼叫[view setNeedsLayout],把標記設為需要佈局,然後馬上呼叫[view layoutIfNeeded],實現佈局

在檢視第一次顯示之前,標記總是“需要重新整理”的,可以直接呼叫[view layoutIfNeeded]

3,重繪

-drawRect:(CGRect)rect:重寫此方法,執行重繪任務
-setNeedsDisplay:標記為需要重繪,非同步呼叫drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect:標記為需要區域性重繪

二、延伸:Auto Layout Process 自動佈局過程

與使用springs and struts(autoresizingMask)比較,Auto layout在view顯示之前,多引入了兩個步驟:updating constraints 和laying out views。

每一個步驟都依賴於上一個。display依賴layout,而layout依賴updating constraints。

updating constraints->layout->display

第一步:updating constraints

被稱為測量階段,其從下向上(from subview to super view),為下一步layout準備資訊。可以通過呼叫方法setNeedUpdateConstraints
去觸發此步。constraints的改變也會自動的觸發此步。但是,當你自定義view的時候,如果一些改變可能會影響到佈局的時候,通常需要自己去通知Auto layout,updateConstraintsIfNeeded。
自定義view的話,通常可以重寫updateConstraints方法,在其中可以新增view需要的區域性的contraints。

第二步:layout

其從上向下(from super view to subview),此步主要應用上一步的資訊去設定view的center和bounds。可以通過呼叫setNeedsLayout去觸發此步驟,此方法不會立即應用layout。如果想要系統立即的更新layout,可以呼叫layoutIfNeeded。另外,自定義view可以重寫方法layoutSubViews來在layout的工程中得到更多的定製化效果。

第三步:display

此步時把view渲染到螢幕上,它與你是否使用Auto layout無關,其操作是從上向下(from super view to subview),通過呼叫setNeedsDisplay觸發,
因為每一步都依賴前一步,因此一個display可能會觸發layout,當有任何layout沒有被處理的時候,同理,layout可能會觸發updating constraints,當constraint system更新改變的時候。
需要注意的是,這三步不是單向的,constraint-based layout是一個迭代的過程,layout過程中,可能去改變constraints,有一次觸發updating constraints,進行一輪layout過程。

**注意:如果你每一次呼叫自定義layoutSubviews都會導致另一個佈局傳遞,那麼你將會陷入一個無限迴圈中。 **

如下圖:


1432381-3553ac8a6996c281.png

參考:
1,原創:iOS中AutoLayer自動佈局流程及相關方法
2,setNeedsUpdateConstraints,needsUpdateConstraints等基於約束的AutoLayer的方法
UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之間的關係解釋

相關文章