1. 兩種方法調(diào)用情況
- layoutSubviews調(diào)用情況
- init初始化UIView不會觸發(fā)調(diào)用
- addSubview會觸發(fā)調(diào)用
- 改變view的width和height的時候回觸發(fā)調(diào)用
- 一個UIScrollView滾動會觸發(fā)調(diào)用
- 旋轉(zhuǎn)screen會觸發(fā)調(diào)用
- 改變一個UIView大小的時候會觸發(fā)superView的layoutSubviews事件
- 直接調(diào)用setLayoutSubviews會觸發(fā)調(diào)用
- -(void)viewWillAppear:(BOOL)animated會觸發(fā)一次調(diào)用
- -(void)viewDidAppear:(BOOL)animated 看情況,可能有調(diào)用。
什么時候重寫layoutSubviews
- 自動布局無法滿足要求(例如要自定義一個按鈕,圖片在文字的右側(cè))
- 不要直接調(diào)用調(diào)用這個方法,可以調(diào)用
setNeedsLayout
、layoutIfNeeded
。
- drawRect調(diào)用情況
- 如果UIView沒有設(shè)置frame大小,直接導(dǎo)致drawRect不能被自動調(diào)用。
- drawRect在loadView和viewDidLoad這兩個方法之后調(diào)用
- 調(diào)用sizeToFit后自動調(diào)用
drawRect
- 通過設(shè)置contentMode值為
UIViewContentModeRedraw
。那么每次設(shè)置或者更改frame
自動調(diào)用drawRect。 - 直接調(diào)用setNeedsDisplay或者setNeedsDisplayInRect會觸發(fā)調(diào)用
使用注意
- 在UIView中繪圖,只能在drawRect方法中,這個方法可以獲取contextRef并繪圖。在其他地方獲取的是無效的
- 如果要在layer中繪圖只能在drawInContext中繪圖
- 如果要實時繪圖不能使用gestureRecognizer,只能用touchBegan等方法來調(diào)用setNeedsDisplay實時刷新屏幕。