- 1.iOS layout機(jī)制相關(guān)方法
- (CGSize)sizeThatFits:(CGSize)size
- (void)sizeToFit
- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
- (void)setNeedsDisplay
- (void)drawRect
- 2.layoutSubviews 被調(diào)用的情況
1.init 初始化時(shí)不會(huì)觸發(fā) layoutSubview, 但是使用 initWithFrame: 進(jìn)行初始化時(shí), 當(dāng) rect 的值不為 CGRectZero 時(shí), 會(huì)觸發(fā)
2.addSubview 會(huì)觸發(fā) layoutSubviews
3.設(shè)置 view 的Frame 會(huì)觸發(fā) layoutSubviews, 前提是 Fraame的值前后發(fā)生變化
4.滾動(dòng)一個(gè) UIScrollView 會(huì)觸發(fā) layoutSubviews
5.旋轉(zhuǎn) Screen 會(huì)觸發(fā) 父View 上的 layoutSubviews 事件
6.改變一個(gè) UIView 大小的時(shí)候, 也會(huì)觸發(fā) 父View 上的 layoutSubviews 事件
在蘋(píng)果的官方文檔中強(qiáng)調(diào):
You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want.
只要調(diào)整尺寸和基于約束的行為的子視圖不提供你想要的行為時(shí), 你應(yīng)重寫(xiě)此方法
- layoutSubviews: 這個(gè)方法默認(rèn)沒(méi)有做任何事情, 需要子類進(jìn)行重寫(xiě)
- setNeedsLayout: 標(biāo)記為需要重新布局, 異步調(diào)用 layoutIfNeeded 刷新布局, 不立即刷新, 但 layoutSubviews 一定會(huì)調(diào)用
- layoutIfNeeded: 如果有需要刷新的標(biāo)記, 立即調(diào)用 layoutSubviews 進(jìn)行布局, 如果沒(méi)有標(biāo)記, 不會(huì)調(diào)用 layoutSubviews
對(duì)于 layoutSubviews 文檔中還指出:
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method
你不應(yīng)該直接調(diào)用該方法, 如果你想更新布局, 在更新布局之前調(diào)用 [view setNeedsLayout] 方法. 如果你想立即更新你的視圖, 則調(diào)用 [view layoutIfNeeded] 方法.
在視圖第一次顯示之前, 標(biāo)記總是 "需要刷新" 的, 可以直接調(diào)用 [view layoutIfNeeded]
- drawRect:(CGRect)rect: 重寫(xiě)此方法, 執(zhí)行重繪任務(wù)
- setNeedsDisplay: 標(biāo)記為需要重繪, 異步調(diào)用 drawRect: 方法
- setNeedsDisolayInRect:(CGRect)invalidRect: 標(biāo)記需要局部重繪
- 5.sizeToFit 與 sizeThatFits:
- (void)sizeToFit
sizeToFit 可以被手動(dòng)直接調(diào)用
調(diào)用 sizeToFit 會(huì)自動(dòng)調(diào)用 sizeThatFits: 方法
sizeToFit 不應(yīng)該在子類中被重寫(xiě), 應(yīng)該重寫(xiě) - (CGSize)sizeThatFits:(CGSize)size
/**
* 調(diào)整尺寸
*
* @param size receiver當(dāng)前的尺寸
*
* @return 返回一個(gè)合適的尺寸
*/
- (CGSize)sizeThatFits:(CGSize)size
- 6.layoutSubviews 與 drawRect
layoutSubviews 對(duì) subviews 重新布局
layoutSubviews 方法調(diào)用先于 drawRect
setNeedsLayout 在receiver標(biāo)上一個(gè)需要被重新布局的標(biāo)記,在系統(tǒng) runloop 的下一個(gè)周期自動(dòng)調(diào)用 layoutSubviews
layoutIfNeeded 方法如其名,UIKit 會(huì)判斷該receiver是否需要 layout.根據(jù)Apple官方文檔, layoutIfNeeded 方法應(yīng)該是這樣的
layoutIfNeeded 遍歷的不是 superview 鏈金度,應(yīng)該是 subviews 鏈
drawRect 是對(duì)receiver的重繪捻悯,能獲得 context
setNeedDisplay 在receiver標(biāo)上一個(gè)需要被重新繪圖的標(biāo)記福青,在下一個(gè)draw周期自動(dòng)重繪旦签,iphone device的刷新頻率是60hz拾稳,也就是1/60秒后重繪