AutoLayer自動佈局流程
一,三個流程
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都會導致另一個佈局傳遞,那麼你將會陷入一個無限迴圈中。 **
如下圖:
參考:
1,原創:iOS中AutoLayer自動佈局流程及相關方法
2,setNeedsUpdateConstraints,needsUpdateConstraints等基於約束的AutoLayer的方法
UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之間的關係解釋
相關文章
- iOS中AutoLayer自動佈局流程及相關方法iOS
- 佈局流程
- 【OC梳理】自動佈局
- Masonry自動佈局使用
- 使用 CSS columns 佈局來實現自動分組佈局CSS
- CSS佈局 --- 自適應佈局CSS
- iOS自動佈局——Masonry詳解iOS
- autorandr:自動調整螢幕佈局
- iOS 自動佈局框架 – Masonry 詳解iOS框架
- iOS自動佈局框架 - Masonry詳解iOS框架
- 電信網路拓撲圖自動佈局之曲線佈局
- 三欄佈局之自適應佈局
- 浮動佈局 和 flex佈局Flex
- 三列自適應佈局(聖盃佈局)
- UITableViewCell使用自動佈局的“最佳實踐”UIView
- Masonry佈局控制元件,自動換行控制元件
- 移動佈局基礎之 流式佈局
- Caramba Switcher for mac自動鍵盤佈局開關Mac
- 電信網路拓撲圖自動佈局
- css自適應佈局CSS
- rem自適應佈局REM
- css佈局之左側固定右側自適應佈局CSS
- 系統學習iOS動畫之二:自動佈局iOS動畫
- HTML流動佈局各種寬度自適應HTML
- 移動端自適應佈局的最好工具-remREM
- CSS-佈局7-多列自動劇中CSS
- 移動端佈局
- Flutter佈局和繪製流程淺析Flutter
- Android View 佈局流程(Layout)完全解析AndroidView
- 3D拓撲自動佈局之Web Workers篇3DWeb
- [分享]iOS開發 - iOS自動佈局的替換方案iOS
- flex佈局,子元素自動撐開並打點(省略)Flex
- 移動端flex佈局Flex
- HTML CSS 浮動佈局⑤HTMLCSS
- GRIDPANEL動態佈局
- Web移動端佈局Web
- iPhone 6的自適應佈局iPhone
- 移動 WEB 開發的佈局方式 ---- 響應式佈局Web