UIView的繪制和重繪操作在drawRect方法中完成,但是蘋果不建議直接調用drawRect方法,如果直接調用此方法,是沒有效果的。蘋果要求我們調用UIView類中的setNeedsDisplay方法,程序會自動調用drawRect方法進行重繪。
在UIView中,重寫drawRect方法,可以自己定義想要畫的圖案。這個drawRect方法一般情況下只會被調用一次。當某些情況下想要手動重畫這個View,只需要掉用setNeedsDisplay方法即可。
drawRect的調用是在Controller->loadView, Controller->viewDidLoad 兩方法之后調用的。所以不用擔心在控制器中這些View的drawRect就開始畫了,這樣可以在控制器中設置一些值給View(如果這些View draw的時候需要用到某些變量值)。
1.如果在UIView初始化時沒有設置rect大小,將直接導致drawRect不被自動調用。
2.該方法在調用sizeThatFits后被調用,所以可以先調用sizeToFit計算出size。然后系統自動調用drawRect:方法。
3.通過設置contentMode屬性值為UIViewContentModeRedraw。那么將在每次設置或更改frame的時候自動調用drawRect:。
4.直接調用setNeedsDisplay,或者setNeedsDisplayInRect:觸發drawRect:,但是有個前提條件是rect不能為0。
以上1,2推薦;而3,4不提倡。
1.若使用UIView繪圖,只能在drawRect:方法中獲取相應的contextRef并繪圖。如果在其他方法中獲取將獲取到一個invalidate的ref并且不能用于畫圖。
2.drawRect:方法不能手動顯示調用,必須通過調用setNeedsDisplay 或者 setNeedsDisplayInRect ,讓系統自動調該方法。
3.若使用calayer繪圖,只能在drawInContext: 中(類似魚drawRect)繪制,或者在delegate中的相應方法繪制。同樣也是調用setNeedDisplay等間接調用以上方法。
4.若要實時畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實時刷新屏幕。
reference:iOS重繪機制drawRect