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