UIView 的布局與繪製顯示相關方法呼叫時機

2021-07-29 12:13:15 字數 1692 閱讀 2182

uiview是我們經常使用的乙個基本控制項,不知道你是否對以下方法在什麼時候呼叫感到疑惑?雖然他們和布局都有關係。

另外還會簡述drawrect的呼叫,sizetofit與sizethatfit的關係。

從字面意思理解就是,布局子檢視,對子檢視進行布局約束設定和調整,你可以重寫它來布局子檢視,但是不應該主動呼叫它,應該使用 setneedlayout 和 layoutifneed機制來觸發。

什麼情況下系統會自動呼叫這個方法 ?

在蘋果的官方文件中強調:你應該重寫這個方法僅僅當你需要改變子檢視的樣式時

呼叫這個方法表示設定了需要布局子檢視的標記,但是不會馬上呼叫layoutsubviews,而是非同步呼叫(即下乙個布局布局週期執行),如果需要馬上實現重新布局,那麼應該呼叫layoutifneed方法。

這個方法在立即自動呼叫layoutsubviews,讓之前設定需要約束的布局立即生效。

對於需要立即生效的約束,在約束新增完成後,可以立即呼叫 setneedlayout 和 layoutifneed。

drawrect 、 setneedsdisplay 、 setneedsdisplayinrec這幾個方法都是與檢視繪畫有關。

呼叫這個方法會重繪檢視(包括子檢視),也可以在裡面獲得繪畫上下文,進行實時繪畫。

需要重繪新增其他的東西或者自定義繪畫,則可以通過重寫的方式實現,如果不需要,不建議重寫。

該方法一般不能顯示呼叫,需要呼叫下面的方法來實現系統呼叫。

1、如果在uiview初始化時沒有設定rect大小,將直接導致drawrect不被自動呼叫。

drawrect 掉用是在controller->loadview, controller->viewdidload 兩方法之後掉用的.所以不用擔心在 控制器中,這些view的drawrect就開始畫了.這樣可以在控制器中設定一些值給view(如果這些view draw的時候需要用到某些變數 值).

2、該方法在呼叫sizetofit後被呼叫,所以可以先呼叫sizetofit計算出size。然後系統自動呼叫drawrect:方法。

3、通過設定contentmode屬性值為uiviewcontentmoderedraw。那麼將在每次設定或更改frame的時候自動呼叫drawrect:。

4、直接呼叫setneedsdisplay,或者setneedsdisplayinrect:觸發drawrect:,但是有個前提條件是rect不能為0。

以上1,2推薦;而3,4不提倡

drawrect方法使用注意點:

1、 若使用uiview繪圖,只能在drawrect:方法中獲取相應的contextref並繪圖。如果在其他方法中獲取將獲取到乙個invalidate 的ref並且不能用於畫圖。drawrect:方法不能手動顯示呼叫,必須通過呼叫setneedsdisplay 或 者 setneedsdisplayinrect,讓系統自動調該方法。

2、若使用calayer繪圖,只能在drawincontext: 中(類似於drawrect)繪製,或者在delegate中的相應方法繪製。同樣也是呼叫setneeddisplay等間接呼叫以上方法

3、若要實時畫圖,不能使用gesturerecognizer,只能在touchbegan等底層方法來使用setneedsdisplay進行實時重新整理螢幕

標記需要重繪,非同步呼叫drawrect方法,在下乙個draw週期(1/60s)呼叫drawrect進行重繪。

標記在某個rect範圍需要重繪。

繪製虛線的UIView

繪製虛線的uiview cashapelayer配合貝塞爾曲線可以繪製曲線,筆者繼承了乙個uiview的子類,並將該子類的backedlayer替換為cashapelayer,以此來實現繪製虛線的效果.繪製出各種虛線的效果圖 實現的原始碼 linedashview.h 與 linedashview....

UIView的繪製原理 和 非同步繪製的實現

uiview 繪製原理 1 當我們呼叫 uiview setneedsdisplay 這個方法時,其實並沒有立即進行繪製工作,系統會立即呼叫calayer的同名方法,並且在當前layer上打上乙個標記,然後會在當前runloop將要結束的時候呼叫calayer display 這個方法,然後進入檢視...

View ViewGroup的測量 布局 繪製流程

注 1 為了方便描述,假定現在有三層布局,分別為 最外層view1 第二層view2 第三層view3 2 下面 測量子控制項 布局子控制項 繪製子控制項 的思路都是 用for迴圈遍歷子控制項,呼叫子控制項的measure layout draw 方法。下面就不對此進行解釋。measure int ...