iOS中View生命週期與佈局

生命週期

說到view的生命週期通常都是指視圖控制器的view生命週期。程序員

view的建立:loadView

視圖控制器(UIViewController)及其子類,不管是手寫代碼仍是storyboard、xib確定會調用loadView方法。其它的視圖不會調用好比UIButton,UILabel等,由於他們不是視圖控制器。下面是視圖控制器被建立時會被調用的其它方法:app

Storyboard/XIB會調用的方法:函數

  • initWithCoder佈局

  • awakeFromNib:此時frame尚未完成。測試

手寫代碼調用的代碼(必須是UIView好比自定義MDDButton : UIButton)orm

  • initWithCoder

initWithFrame,建立時init會被調用此方法(能夠繼承UIView,作下測試),不過frame爲0.除非顯示調用此方法,frame纔會有值,好比:[[MDDButton alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];這樣顯示的調用frame不爲0。blog

view採用懶加載的方式,只有用到view時纔會被建立,即纔會被調用 loadView ——>viewDidLoad這一系列函數繼承

viewDidLoad

加載到內存完成後會調用此函數,在視圖切換中,只要控制器不從內存中移除此方法就不會被調用。通常在此方法中添加一些子控件,設置視圖的初始屬性等等,相似初始化。生命週期

viewWillAppear

即將加載到窗口時調用此方法。通常在此方法作一些較爲耗時的。這樣就能夠先顯示基本的視圖,呈現給用戶(讓用戶感受不是那麼卡),而後再顯示比較耗時的。以避免顯示一個白屏給用戶。內存

viewDidAppear

視圖已經加載到窗口時調用。

如下:

  • viewWillDisappear-視圖即將消失、被覆蓋或是隱藏時調用;

  • viewDidDisappear-視圖已經消失、被覆蓋或是隱藏時調用;

  • viewVillUnload-當內存太低時,須要釋放一些不須要使用的視圖時,即將釋放時調用;

  • viewDidUnload-當內存太低,釋放一些不須要的視圖時調用。

佈局

咱們能看到手機上的視圖都是UIView還有它的子UIView,固然不能雜亂無章的顯示。要進行佈局,父UIView須要佈局、排列這些子UIView。UIView提供了layoutSubviews方法來處理。

須要注意的是layoutSubviews方法由系統來調用,不能程序員來手動調用。能夠調用setNeedsLayout方法進行標記,以保證在UI下個刷屏循環中系統會調用layoutSubviews。或者調用layoutIfNeeded直接請求系統調用layoutSubviews。

layoutSubviews的被調用的時機:

  • addSubview會觸發layoutSubviews,好比viewA add viewB,第一次添加A和B的layoutSubviews都會被調用,而第二次(viewA已經有了viewB)只調用viewB的
  • view的Frame變化會觸發layoutSubviews
  • 滾動一個UIScrollView會觸發layoutSubviews
  • 旋轉Screen會觸發父UIView上的layoutSubviews
  • 改變transform屬性時,固然frame也會變
  • 處於key window的UIView纔會調用(程序同一時間只有一個window爲keyWindow,能夠簡單理解爲顯示在最前面的window爲keywindow)

最後總結一句話就是,有必要時纔會調用,好比設置Frame值沒有變化,是不會被調用的,很明顯沒有必要

相關文章
相關標籤/搜索