2014年11月26日 星期三

關於ViewController以及autolayout你應該要知道的事

一、生命週期的呼叫順序:

  1. initWithNibName
  2. loadView
  3. viewDidLoad
  4. viewWillAppear
  5. viewWillLayoutSubviews
  6. viewDidLayoutSubviews
  7. viewDidAppear
  8. viewWillDisappear
  9. viewDidDisappear
  10. dealloc
initWithNibName 
若以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會發生下列的步驟:

  1. self.view改變size.
  2. 如果沒使用autolayout,才會以autoresizing masks來調整大小
  3. view controller的 viewWillLayoutSubviews 方法將會被呼叫。
  4. self.view的 layoutSubviews 方法會被呼叫,如果使用auto layout他會執行下列步驟:
    1. view controller 的 updateViewConstraints 方法會被呼叫。
    2. updateViewConstraints會去呼叫各個view的 updateConstraints 方法。
    3. 計算新的layout,並重置views到新的位置。
  5. 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自動達成的位置。

    沒有留言:

    張貼留言