drawRect:和layoutSubview的區(qū)別
開宗明義,
drawRect:和layoutSubview的區(qū)別點有很多序厉。但是锐膜,比較關(guān)心的是用法上的區(qū)別:
雖然平時要自定義繪圖比較少,畢竟有UI切圖弛房,但是要自定義繪圖(比如道盏,CALayer)時二者中只能用drawRect,這是二者用法上最大的區(qū)別。
1.drawRect:(方便視圖重繪)
顯示(setNeedsDisplay)---------->重繪矩形(drawRect,前提rect不為0)------------------->拿到畫板-------------->畫圖:
1文捶、 若使用UIView繪圖荷逞,只能在drawRect:方法中獲取相應(yīng)的contextRef并繪圖。如果在其他方法中獲取將獲取到一個invalidate 的ref并且不能用于畫圖种远。drawRect:方法不能手動顯示調(diào)用顽耳,必須通過調(diào)用setNeedsDisplay 或 者 setNeedsDisplayInRect,讓系統(tǒng)自動調(diào)該方法射富。
2膝迎、若使用calayer繪圖限次,只能在drawInContext: 中(類似魚drawRect)繪制柴灯,或者在delegate中的相應(yīng)方法繪制。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法
3赠群、若要實時畫圖,不能使用gestureRecognizer店枣,只能使用touchbegan等方法來掉用setNeedsDisplay實時刷新屏幕
2.layoutSubViews:(方便數(shù)據(jù)計算速警,彌補autoresizing功能的不足)
布局------------->布局子視圖------------------->處理子視圖的數(shù)據(jù)
內(nèi)部調(diào)用用,外部更新frame時长豁,建議寫新的方法忙灼,而不是用setNeedsLayout,畢竟layoutSubViews有很多地方會調(diào)用
內(nèi)部調(diào)用
1.drawRect:
sizeToFit(不應(yīng)該重寫)后自動調(diào)用----------->sizeThatFits(可重寫钝侠,真正起作用是這個)
sizeToFit同時也自動調(diào)用--------------------->drawRect(自動布局的雛形)
通過設(shè)置contentMode屬性值為UIViewContentModeRedraw酸舍。那么將在每次設(shè)置或更改frame的時候自動調(diào)用drawRect:。(從這個功能上講忽舟,有點等同于layoutSubViews)
2.:
setNeedsLayout----------->layoutIfNeeded + (刷新標記)----------->layoutSubviews