寫在前面
-
UIView對于iOS開發(fā)來講,再熟悉不過了。也正是因為這一點,我們可能會忽略UIView一些特有方法的理解和使用。今天,筆者主要整理一下對drawRect方法的理解和使用。 - 默認情況下,該方法在視圖加載過程中不做任何人處理。當子類使用
Core Graphics和UIKit繪制視圖內(nèi)容時就需要在該方法中添加繪制的代碼。
drawRect簡介
-
drawRect方法在UIView的使用上起著十分關鍵的作用。不知道大家注意過沒有,每一次創(chuàng)建UIView子類文件時候,會有自動帶有已注釋的drawRect方法,也許從這一點就能看出這個方法的重要性。 - 該方法定義在
UIView(UIViewRendering)分類里面,望文生義,該方法完成視圖的繪制。
drawRect作用
Only override drawRect: if you perform custom drawing.- 重繪作用:重寫該方法以實現(xiàn)自定義的繪制內(nèi)容
drawRect調用場景
- 視圖第一次顯示的時候會調用。這個是由系統(tǒng)自動調用的,主要是在
UIViewController中loadView和viewDidLoad方法調用之后; - 如果在
UIView初始化時沒有設置rect大小,將直接導致drawRect不被自動調用; - 該方法在調用
sizeThatFits后被調用,所以可以先調用sizeToFit計算出size,然后系統(tǒng)自動調用drawRect:方法; - 通過設置
contentMode屬性值為UIViewContentModeRedraw,那么將在每次設置或更改frame的時候自動調用drawRect:; - 直接調用
setNeedsDisplay,或者setNeedsDisplayInRect:觸發(fā)drawRect:,但是有個前提條件是rect不能為0;
drawRect重繪方法定義
-
- (void)drawRect:(CGRect)rect;:重寫此方法,執(zhí)行重繪任務; -
- (void)setNeedsDisplay;:標記為需要重繪,異步調用drawRect,但是繪制視圖的動作需要等到下一個繪制周期執(zhí)行,并非調用該方法立即執(zhí)行; -
- (void)setNeedsDisplayInRect:(CGRect)rect;:標記為需要局部重繪,具體調用時機同上;
drawRect使用注意事項
- 如果子類直接繼承自
UIView,則在drawRect方法中不需要調用super方法。若子類繼承自其他View類則需要調用super方法以實現(xiàn)重繪。 - 若使用
UIView繪圖,只能在drawRect:方法中獲取繪制視圖的contextRef。在其他方法中獲取的contextRef都是不生效的; -
drawRect:方法不能手動調用,需要調用實例方法setNeedsDisplay或者setNeedsDisplayInRect,讓系統(tǒng)自動調用該方法; - 若使用
CALayer繪圖,只能在drawInContext :繪制,或者在delegate方法中進行繪制,然后調用setNeedDisplay方法實現(xiàn)最終的繪制; - 若要實時畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來掉用setNeedsDisplay實時刷新屏幕 ------這個闡述需要調整
-
UIImageView繼承自UIView,但是UIImageView能不重寫drawRect方法用于實現(xiàn)自定義繪圖。具體原因如下圖所示:
Apple官方文檔描述
小結一下
上面的幾個問題說的有些啰嗦了,總結一下需要掌握一下幾點:
- 了解
drawRect使用場景; - 哪些方法可以調用;
- 了解何時進行重繪;
