生命週期數據庫
1. loadView
何時調用?
每次訪問UIViewController的view時候而且view == nil時候調用.
如何實現?
1> 若是在初始化UIViewController指定了xib文件名,就會根據傳入的xib文件名加載對應的xib文件.若是沒有明顯地傳xib文件名,就會加載跟UIViewController同名的xib文件.
2> 若是沒有找到相關聯的xib文件,就會建立一個空白的UIView,而後賦值給UIViewController的view屬性.
例如:
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
如何使用?
若是想經過代碼來建立UIViewController的view,就要重寫loadView方法,而且不須要調用[super loadView]
,由於在第3點裏面已經提到:若沒有xib文件,[super loadView]
默認會建立一個空白的UIView。咱們既然要經過代碼來自定義UIView,那麼就不必事先建立一個空白的UIView,以節省沒必要要的開銷。正確的作法應該是這樣:
-(void)loadView { self.view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; }
不須要調用[super loadView]
,你調用了也不會出錯,只是形成了一些沒必要要的開銷。
loadView以前沒有view.該方法執行完以後,view會被加載完成,此時纔有view,可是view尚未加載到任何一個view上.而後會調用viewDidLoad方法.網絡
2. viewDidLoad
- loadView 方法執行完畢就會調用viewDidLoad
作一些界面的初始化,好比往view中添加一些子視圖,從數據庫或者網絡加載模型數據裝配子視圖中.app
3. viewWillAppear
視圖將要出現 view已經顯示,被加載到另外一個view上了.異步
4. viewDidAppear
視圖已經出現佈局
5.viewWillDisappear
視圖將要消失動畫
6. viewDidDisappear
視圖即將消失code
init 和 intWithFrame對象
建議不要使用重寫UIView的時候不要使用init方法,而使用initWithFrame.由於用init初始化的frame尚未.可是不管是init仍是initWithFrame方法最終都會進入initWithFrame方法.在這個方法中建立子控件,能夠保證不管哪一種方式均可以成功建立。
init 內部會調用父類的 initWithFrame: 方法,只不過傳入的 frame 的值爲0,而後父類的 initWithFrame: 方法發現當前的調用對象是子類對象,因此就調用了子類的initWithFrame方法了。這是一個多態的應用。
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; // 先調用父類的initWithFrame方法 if (self) { // 再自定義該類(UIView子類)的初始化操做。 } return self; }
blog
layoutSubviews生命週期
- 這個方法默認沒有作任何事情,須要子類進行重寫.系統在不少的時候會調用這個方法.
- 初始化不會觸發layout方法,可是當設置不爲CGRectZero的frame的時候就會觸發.
- addSubview會觸發layoutSubViews方法.
- 當view的frame發生改變的時候,會調用次方法.
- 滾動UIScrollview的時候
- 改變一個UIView的大小的時候也會觸發其父UIView的layoutSubViews方法.
- 記得要用父類調用
[super layoutSubViews];
drawRect
- iOS的繪圖操做是在UIView類的drawRect方法完成的.功能:繪製圖形,圖片,文字,裁剪圖片.因此若是咱們要想在一個UIView中繪圖,須要寫一個擴展UIView的類,並重寫drawRect方法,在這裏進行繪圖操做,程序會自動調用此方法進行繪圖.在建立UIView對象的同時,會自動的調用一次這個方法.drawRect:方法不能手動顯示調用,必須經過調用setNeedsDisplay 或者 setNeedsDisplayInRect ,讓系統自動調該方法.因此咱們想要從新繪製這個圖形時,不能手動的進行調用(沒有效果),直接是用
[self setNeedsDisplay]
,系統會自動的調用這個方法,進行從新的繪製.
- 若是在UIView初始化時沒有設置rect大小,將直接致使drawRect不被自動調用。drawRect 掉用是在Controller->loadView,?Controller->viewDidLoad?兩方法以後掉用的.因此不用擔憂在 控制器中,這些View的drawRect就開始畫了.這樣能夠在控制器中設置一些值給View(若是這些View?draw的時候須要用到某些變量 值).
- 該方法在調用sizeToFit後被調用,因此能夠先調用sizeToFit計算出size。而後系統自動調用drawRect:方法。
- 直接調用setNeedsDisplay,或者setNeedsDisplayInRect:觸發drawRect:,可是有個前提條件是rect不能爲0。
- 若要實時畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來調用setNeedsDisplay實時刷新屏幕
- 繪圖的方法都是在UIView的drawRect中執行的,對於一次性就能畫好的圖,直接使用drawRect便可,無需調用UIView的setNeedsDisplay。但若想屢次調用drawRect,即想作出動畫效果(如柱狀圖,效果是慢慢升起),術語叫重繪,那麼就須要調用UIView的setNeedsDisplay方法。使用了setNeedsDisplay方法,程序會調用drawRect。相似於cellForRowAtIndexPath,無需在initWithFrame或viewDidLoad中調用,即可以直接被系統執行。
setNeedDisplay 和 setNeedsLayout
- 首先兩個方法都是異步執行. 而setNeedDisplay 會自動調用drawRect方法,這樣能夠拿到UIGraphicsGetCurrentContext,就能夠繪畫了.而setNeedsLayout會默認調用layoutSubViews,就能夠處理子視圖的一些數據.綜上所訴,setNeedsDisplay方便繪圖,而layoutSubViews方便出來數據。 標記爲須要從新佈局,不當即刷新,但layoutSubViews必定會被調用.