一、生命週期的呼叫順序:
- initWithNibName
- loadView
- viewDidLoad
- viewWillAppear
- viewWillLayoutSubviews
- viewDidLayoutSubviews
- viewDidAppear
- viewWillDisappear
- viewDidDisappear
- dealloc
若以xib呼叫時,會執行這裡,不需要在這覆寫什麼東西。
loadView
這裡要非常注意,因為在xcode會自動生成一些code在這裡,目的是連結Interface Builder與你的ViewController Class。
所以一般使用xib或storyboard是不需要去override這個methed,如果真的想不開,請記得先執行[super loadView],不然你肯定找不到你辛苦拉好的view。
如果你沒用xib,就是要在這裡建立你要的self.view。
viewDidLoad
當View被load好之後,會執行這裡,且在生命週期中只會執行一次,所以一些初始值的設定盡量放在這。
viewWillAppear
view被load好之後,就要將它顯示出來,在顯示之前會執行這裡。
這裡在每次顯示前都會被執行,所以可以在此設定一些隨著每次畫面出現,都要變動的值。
viewWillLayoutSubviews
viewDidLayoutSubviews
在viewWillAppear時,還沒有做些auto layout的調整,將會在這裡才實作,
意思是如果你想要抓取UI在auto layout之後的frame,從這裡被執行之後才能抓到。
值得注意的是,這兩個function是只要有畫面的變動時,就會被觸發,被觸發的頻率比viewWillAppear/viewDidAppear來的高很多。
其他的就差不多是類似的意思,例如viewWillDisappear,就是在畫面將消失前會觸發。
二、接下來要介紹的是接到memoryWarming的回收方式:
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
if ([self.view window] == nil)
{
// 如果view的window為nil,代表self.view已經不在顯示。
//TODO:一、加入code讓你要保留的值存到安全的地方
//TODO:二、把你設為strong的值,指定為nil
// 最後讓你的self.view = nil;
self.view = nil;
}
}
三、改變self.view大小的流程(auto layout的執行過程)
當view controller的size改變時,他的subview們也會重新調整自己的位置。他們通常使用layout constraints和autoresizing masks,這時view controller會發生下列的步驟:- self.view改變size.
- 如果沒使用autolayout,才會以autoresizing masks來調整大小
- view controller的 viewWillLayoutSubviews 方法將會被呼叫。
- self.view的 layoutSubviews 方法會被呼叫,如果使用auto layout他會執行下列步驟:
- view controller 的 updateViewConstraints 方法會被呼叫。
- updateViewConstraints會去呼叫各個view的 updateConstraints 方法。
- 計算新的layout,並重置views到新的位置。
- view controller的 viewDidLayoutSubviews 方法被呼叫。
四、autolayout的最佳執行方式建議
如果你是開發於iOS 6 and later
先使用layout constraints來自動設定你的view的位置(iOS 6 and later)
你可以去覆寫updateViewConstraints方法 來加入一些需求額外客製化的layout constraints,但記得一定要在方法中先加入[super updateViewConstraints];來實作自動產生的UI constrains.
如果你是用iOS 5.x
使用autoresizing masks,你要覆寫layoutSubviews來設定一些無法用resizing masks自動達成的位置。