iOS中AutoLayer自動佈局流程及相關方法

weixin_33895657發表於2016-08-19

http://my.oschina.net/w11h22j33/blog/208574

http://www.jianshu.com/p/eb2c4bb4e3f1

layoutSubviews

setNeedsLayout

layoutIfNeeded

一、layoutSubviews在以下情況被呼叫:

1、init初始化不會觸發layoutSubviews

2、addSubview會觸發layoutSubviews

3、設定view的Frame會觸發layoutSubviews,當然前提是frame的值設定前後發生了變化

4、滾動一個UIScrollView會觸發layoutSubviews

5、旋轉Screen會觸發父UIView上的layoutSubviews事件

6、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件

二、setNeedsLayout

此方法會將view當前的layout設定為無效的,並在下一個upadte cycle裡去觸發layout更新。

標記為需要重新佈局,非同步呼叫layoutIfNeeded重新整理佈局,不立即重新整理,但layoutSubviews一定會被呼叫。

三、layoutIfNeeded

如果有需要重新整理的標記,立即呼叫layoutSubviews進行佈局,如果沒有標記,不會呼叫實現佈局。

使用此方法強制立即進行layout,從當前view開始,此方法會遍歷整個view層次(包括superviews)請求layout。因此,呼叫此方法會強制整個view層次佈局。

如果要立即重新整理,要先呼叫[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秒後重繪

updattingConstraints 其從下向上(from subview to super view),為下一步layout準備資訊。

[self.view setNeedsUpdateContraints];

[self.view updateContraintsIfNeeded];

[self updateContraints];

layout 其從上向下(from super view to subview),此步主要應用上一步的資訊去設定view的center和bounds。

[self layoutIfNeeded];

display 此步時把view渲染到螢幕上,它與你是否使用Auto layout無關,其操作是從上向下(from super view to subview),

[self setNeedDisplay];

相關文章