iOS中View生命周期與布局


生命周期

說到view的生命周期一般都是指視圖控制器的view生命周期。

view的創建:loadView

視圖控制器(UIViewController)及其子類,無論是手寫代碼還是storyboard、xib肯定會調用loadView方法。其它的視圖不會調用比如UIButton,UILabel等,因為他們不是視圖控制器。下面是視圖控制器被創建時會被調用的其它方法:

Storyboard/XIB會調用的方法:

  • initWithCoder

  • awakeFromNib:此時frame還沒有完成。

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

  • initWithCoder

initWithFrame,創建時init會被調用此方法(可以繼承UIView,做下測試),不過frame為0.除非顯示調用此方法,frame才會有值,比如:[[MDDButton alloc] initWithFrame:CGRectMake(10, 10, 100, 40)];這樣顯示的調用frame不為0。

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值沒有變化,是不會被調用的,很明顯沒有必要


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM