UIView的setNeedsDisplay
和setNeedsLayout
方法
一. 首先兩個方法都是異步執(zhí)行的。而setNeedsDisplay
會調(diào)用自動調(diào)用drawRect
方法严望,這樣可以拿到 UIGraphicsGetCurrentContext
挚躯,就可以畫畫了敞临。而setNeedsLayout
會默認調(diào)用layoutSubViews
,
就可以 處理子視圖中的一些數(shù)據(jù)。
綜上所訴,setNeedsDisplay
方便繪圖涡贱,而layoutSubViews
方便出來數(shù)據(jù)。
layoutSubviews在以下情況下會被調(diào)用:
- init初始化不會觸發(fā)layoutSubviews惹想。
-
addSubview
會觸發(fā)layoutSubviews问词。 - 設置view的
Frame
會觸發(fā)layoutSubviews
,當然前提是frame的值設置前后發(fā)生了變化嘀粱。 - 滾動一個
UIScrollView
會觸發(fā)layoutSubviews激挪。 -
旋轉(zhuǎn)Screen
會觸發(fā)父UIView上的layoutSubviews事件。 - 改變一個
UIView大小
的時候也會觸發(fā)父UIView上的layoutSubviews事件锋叨。 - 直接調(diào)用
setLayoutSubviews
垄分。
二. drawRect在以下情況下會被調(diào)用:
1、如果在UIView初始化時沒有設置rect大小悲柱,將直接導致drawRect不被自動調(diào)用锋喜。drawRect調(diào)用是在Controller->loadView, Controller->viewDidLoad
兩方法之后調(diào)用的.所以不用擔心在控制器中,這些View的drawRect就開始畫了.這樣可以在控制器中設置一些值給View(如果這些View draw的時候需要用到某些變量值).
2些己、該方法在調(diào)用sizeToFit
后被調(diào)用豌鸡,所以可以先調(diào)用sizeToFit計算出size。然后系統(tǒng)自動調(diào)用drawRect:方法段标。
3涯冠、通過設置contentMode屬性值為UIViewContentModeRedraw
。那么將在每次設置或更改frame的時候自動調(diào)用drawRect:逼庞。
4蛇更、直接調(diào)用setNeedsDisplay
,或者setNeedsDisplayInRect:觸發(fā)drawRect:,但是有個前提條件是rect不能為0派任。
以上1,2推薦砸逊;而3,4不提倡
drawRect方法使用注意點:
- 若使用UIView繪圖,只能在drawRect:方法中獲取相應的contextRef并繪圖掌逛。如果在其他方法中獲取將獲取到一個invalidate的ref并且不能用于畫圖师逸。
drawRect:方法不能手動顯示調(diào)用,必須通過調(diào)用setNeedsDisplay 或者 setNeedsDisplayInRect豆混,讓系統(tǒng)自動調(diào)該方法
篓像。 - 若使用
calayer繪圖
,只能在drawInContext: 中(類似于drawRect)繪制皿伺,或者在delegate中的相應方法繪制员辩。同樣也是調(diào)用setNeedDisplay等間接調(diào)用以上方法 - 若要實時畫圖,
不能使用gestureRecognizer
鸵鸥,只能使用touchbegan
等方法來掉用setNeedsDisplay實時刷新屏幕