drawRect:和layoutSubviews:

1. layoutSubviews:

layoutSubviews是佈局Subviews時候調用的, 經測試: 在自動佈局中, 調用此方法時候, self自己frame已經計算出來, 可是Subviews的frame並無計算出來. 此方法自己是不作任何事情的, 咱們能夠根據本身須要, 重寫此方法, 在此方法中從新佈局view.佈局

layoutSubviews在如下狀況下會被調用:測試

一、init初始化不會觸發layoutSubviews。 二、addSubview會觸發layoutSubviews。 三、設置view的Frame會觸發layoutSubviews,固然前提是frame的值設置先後發生了變化。 四、滾動一個UIScrollView會觸發layoutSubviews。 五、旋轉Screen會觸發父UIView上的layoutSubviews事件。 六、改變一個UIView大小的時候也會觸發父UIView上的layoutSubviews事件。 七、直接調用setLayoutSubviews。url

2. drawRect:

自動佈局中, drawRect:方法被調用時候self和SubViews的frame都已經被計算好.code

drawRect方法能夠用來操做view上的layer信息, 好比向view上面添加一個subLayer. 好比持用CGContentRef或者UIBezierPath繪圖時候能夠重寫此方法進行繪製.事件

drawRect在如下狀況下會被調用:get

一、若是在UIView初始化時沒有設置rect大小,將直接致使drawRect不被自動調用。drawRect 掉用是在Controller->loadView,?Controller->viewDidLoad?兩方法以後掉用的.因此不用擔憂在 控制器中,這些View的drawRect就開始畫了.這樣能夠在控制器中設置一些值給View(若是這些View?draw的時候須要用到某些變量 值). 二、該方法在調用sizeToFit後被調用,因此能夠先調用sizeToFit計算出size。而後系統自動調用drawRect:方法。 三、經過設置contentMode屬性值爲UIViewContentModeRedraw。那麼將在每次設置或更改frame的時候自動調用drawRect:。 四、直接調用setNeedsDisplay,或者setNeedsDisplayInRect:觸發drawRect:,可是有個前提條件是rect不能爲0。it

drawRect:使用注意事項:變量

一、 若使用UIView繪圖,只能在drawRect:方法中獲取相應的contextRef並繪圖。若是在其餘方法中獲取將獲取到一個invalidate 的ref而且不能用於畫圖。drawRect:方法不能手動顯示調用,必須經過調用setNeedsDisplay?或 者?setNeedsDisplayInRect,讓系統自動調該方法。 二、若使用calayer繪圖,只能在drawInContext:?中(相似於drawRect)繪製,或者在delegate中的相應方法繪製。一樣也是調用setNeedDisplay等間接調用以上方法 三、若要實時畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來調用setNeedsDisplay實時刷新屏幕date

以上內容有參考下面地址, 也有本身見解和測試:方法

http://zhidao.baidu.com/link?url=Gg8RILdOPAQIOiDzamgoRHC6TliBnAzft8-wJDifZhIzYqDIjjQvZ0Ce8osZ5j66437O-RjLwvb55s9yZQACt3-QQaDwtyJrZ_7-9VMSZPG

相關文章
相關標籤/搜索