ios layoutSubviews呼叫隨手筆記

想想還是算了發表於2018-10-30

iOS autolayout機制相關方法

- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit

- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout

- (void)setNeedsDisplay
- (void)drawRect
複製程式碼

layoutSubviews在以下情況下會被呼叫:
1、addSubview會觸發layoutSubviews
2、設定view的Frame會觸發layoutSubviews,當然前提是frame的值設定前後發生了變化
3、滾動一個UIScrollView會觸發layoutSubviews
4、旋轉Screen會觸發父UIView上的layoutSubviews事件
5、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件
在蘋果的官方文件中強調:

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

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

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

重繪

-drawRect:(CGRect)rect方法:重寫此方法,執行重繪任務
-setNeedsDisplay方法:標記為需要重繪,非同步掉用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:標記為需要區域性重繪
複製程式碼

sizeToFit會自動呼叫sizeThatFits方法;
sizeToFit不應該在子類中被重寫,應該重寫sizeThatFits
sizeThatFits傳入的引數是receiver當前的size,返回一個適合的size

sizeToFit可以被手動直接呼叫
sizeToFit和sizeThatFits方法都沒有遞迴,對subviews也不負責,只負責自己


layoutSubviews對subviews重新佈局 layoutSubviews方法呼叫先於drawRect

setNeedsLayout在receiver標上一個需要被重新佈局的標記,在系統runloop的下一個週期自動呼叫layoutSubviews

layoutIfNeeded方法如其名,UIKit會判斷該receiver是否需要layout.根據Apple官方文件,layoutIfNeeded方法應該是這樣的

layoutIfNeeded遍歷的不是superview鏈,應該是subviews鏈

drawRect是對receiver的重繪,能獲得context

setNeedDisplay在receiver標上一個需要被重新繪圖的標記,在下一個draw週期自動重繪,iphone device的重新整理頻率是60hz,也就是1/60秒後重繪

相關文章