[UIVIew]談?wù)剬?duì)drawRect的理解

寫(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 GraphicsUIKit繪制視圖內(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)用的,主要是在UIViewControllerloadViewviewDidLoad方法調(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)行重繪;

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容