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