首先兩個方法都是非同步執行。layoutsubviews方便資料計算,drawrect方便檢視重繪。
layoutsubviews在以下情況下會被呼叫:
1、init初始化不會觸發layoutsubviews。
2、addsubview會觸發layoutsubviews。
3、設定view的frame會觸發layoutsubviews,當然前提是frame的值設定前後發生了變化。
4、滾動乙個uiscrollview會觸發layoutsubviews。
5、旋轉screen會觸發父uiview上的layoutsubviews事件。
6、改變乙個uiview大小的時候也會觸發父uiview上的layoutsubviews事件。
7、直接呼叫setlayoutsubviews。
drawrect在以下情況下會被呼叫:
1、如果在uiview初始化時沒有設定rect大小,將直接導致drawrect不被自動呼叫。
drawrect 掉用是在controller->loadview, controller->viewdidload 兩方法之後掉用的.所以不用擔心在 控制器中,這些view的drawrect就開始畫了.這樣可以在控制器中設定一些值給view(如果這些view draw的時候需要用到某些變數 值).
2、該方法在呼叫sizet
ofit後被呼叫,所以可以先呼叫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實時重新整理螢幕
原文:
layoutSubviews什麼時候呼叫
layoutsubviews在以下情況下會被呼叫 1 init初始化不會觸發layoutsubviews 2 addsubview會觸發layoutsubviews 3 設定view的frame會觸發layoutsubviews,當然前提是frame的值設定前後發生了變化 4 滾動乙個uiscrol...
什麼時候呼叫CDC DeleteDC ?
很多人在在圖形程式設計時,不太清楚什麼時候呼叫cdc deletedc 其實非常簡單,一般而言,這個函式不用我們自己去呼叫,cdc類的析構函式會去為我們自動呼叫這個函式的。這個函式的功能就是為我們刪除當前cdc物件中的m hdc成員變數。如果dc是通過 createdc createic or cr...
什麼時候呼叫CDC DeleteDC ?
很多人在在圖形程式設計時,不太清楚什麼時候呼叫cdc deletedc 其實非常簡單,一般而言,這個函式不用我們自己去呼叫,cdc類的析構函式會去為我們自動呼叫這個函式的。這個函式的功能就是為我們刪除當前cdc物件中的m hdc成員變數。如果dc是通過 createdc createic or cr...