[UIVIew]談談對drawRect的理解

寫在前面

  • UIView對于iOS開發(fā)來講,再熟悉不過了。也正是因為這一點,我們可能會忽略UIView一些特有方法的理解和使用。今天,筆者主要整理一下對drawRect方法的理解和使用。
  • 默認情況下,該方法在視圖加載過程中不做任何人處理。當子類使用Core GraphicsUIKit繪制視圖內(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)自動調用的,主要是在UIViewControllerloadViewviewDidLoad方法調用之后;
  • 如果在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使用場景;
  • 哪些方法可以調用;
  • 了解何時進行重繪;

參考文獻

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容