UIView的生命週期和layout方法總結

生命週期數據庫

1.jpg

1. loadView

  • 何時調用?

    每次訪問UIViewController的view時候而且view == nil時候調用.
  • 如何實現?

    1> 若是在初始化UIViewController指定了xib文件名,就會根據傳入的xib文件名加載對應的xib文件.若是沒有明顯地傳xib文件名,就會加載跟UIViewController同名的xib文件.
    2> 若是沒有找到相關聯的xib文件,就會建立一個空白的UIView,而後賦值給UIViewController的view屬性.
    例如:
    self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
  • 如何使用?

    若是想經過代碼來建立UIViewController的view,就要重寫loadView方法,而且不須要調用[super loadView],由於在第3點裏面已經提到:若沒有xib文件,[super loadView]默認會建立一個空白的UIView。咱們既然要經過代碼來自定義UIView,那麼就不必事先建立一個空白的UIView,以節省沒必要要的開銷。正確的作法應該是這樣:
    -(void)loadView { self.view = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; }
    不須要調用[super loadView],你調用了也不會出錯,只是形成了一些沒必要要的開銷。
    loadView以前沒有view.該方法執行完以後,view會被加載完成,此時纔有view,可是view尚未加載到任何一個view上.而後會調用viewDidLoad方法.網絡

    2. viewDidLoad

  • loadView 方法執行完畢就會調用viewDidLoad
  • 作一些界面的初始化,好比往view中添加一些子視圖,從數據庫或者網絡加載模型數據裝配子視圖中.app

    3. viewWillAppear

    視圖將要出現 view已經顯示,被加載到另外一個view上了.異步

    4. viewDidAppear

    視圖已經出現佈局

    5.viewWillDisappear

    視圖將要消失動畫

    6. viewDidDisappear

    視圖即將消失code

init 和 intWithFrame對象

建議不要使用重寫UIView的時候不要使用init方法,而使用initWithFrame.由於用init初始化的frame尚未.可是不管是init仍是initWithFrame方法最終都會進入initWithFrame方法.在這個方法中建立子控件,能夠保證不管哪一種方式均可以成功建立。
init 內部會調用父類的 initWithFrame: 方法,只不過傳入的 frame 的值爲0,而後父類的 initWithFrame: 方法發現當前的調用對象是子類對象,因此就調用了子類的initWithFrame方法了。這是一個多態的應用。
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; // 先調用父類的initWithFrame方法 if (self) { // 再自定義該類(UIView子類)的初始化操做。 } return self; }blog

layoutSubviews生命週期

  • 這個方法默認沒有作任何事情,須要子類進行重寫.系統在不少的時候會調用這個方法.
  • 初始化不會觸發layout方法,可是當設置不爲CGRectZero的frame的時候就會觸發.
  • addSubview會觸發layoutSubViews方法.
  • 當view的frame發生改變的時候,會調用次方法.
  • 滾動UIScrollview的時候
  • 改變一個UIView的大小的時候也會觸發其父UIView的layoutSubViews方法.
  • 記得要用父類調用[super layoutSubViews];

drawRect

  • iOS的繪圖操做是在UIView類的drawRect方法完成的.功能:繪製圖形,圖片,文字,裁剪圖片.因此若是咱們要想在一個UIView中繪圖,須要寫一個擴展UIView的類,並重寫drawRect方法,在這裏進行繪圖操做,程序會自動調用此方法進行繪圖.在建立UIView對象的同時,會自動的調用一次這個方法.drawRect:方法不能手動顯示調用,必須經過調用setNeedsDisplay 或者 setNeedsDisplayInRect ,讓系統自動調該方法.因此咱們想要從新繪製這個圖形時,不能手動的進行調用(沒有效果),直接是用[self setNeedsDisplay],系統會自動的調用這個方法,進行從新的繪製.
  • 若是在UIView初始化時沒有設置rect大小,將直接致使drawRect不被自動調用。drawRect 掉用是在Controller->loadView,?Controller->viewDidLoad?兩方法以後掉用的.因此不用擔憂在 控制器中,這些View的drawRect就開始畫了.這樣能夠在控制器中設置一些值給View(若是這些View?draw的時候須要用到某些變量 值).
  • 該方法在調用sizeToFit後被調用,因此能夠先調用sizeToFit計算出size。而後系統自動調用drawRect:方法。
  • 直接調用setNeedsDisplay,或者setNeedsDisplayInRect:觸發drawRect:,可是有個前提條件是rect不能爲0。
  • 若要實時畫圖,不能使用gestureRecognizer,只能使用touchbegan等方法來調用setNeedsDisplay實時刷新屏幕
  • 繪圖的方法都是在UIView的drawRect中執行的,對於一次性就能畫好的圖,直接使用drawRect便可,無需調用UIView的setNeedsDisplay。但若想屢次調用drawRect,即想作出動畫效果(如柱狀圖,效果是慢慢升起),術語叫重繪,那麼就須要調用UIView的setNeedsDisplay方法。使用了setNeedsDisplay方法,程序會調用drawRect。相似於cellForRowAtIndexPath,無需在initWithFrame或viewDidLoad中調用,即可以直接被系統執行。

setNeedDisplay 和 setNeedsLayout

  • 首先兩個方法都是異步執行. 而setNeedDisplay 會自動調用drawRect方法,這樣能夠拿到UIGraphicsGetCurrentContext,就能夠繪畫了.而setNeedsLayout會默認調用layoutSubViews,就能夠處理子視圖的一些數據.綜上所訴,setNeedsDisplay方便繪圖,而layoutSubViews方便出來數據。 標記爲須要從新佈局,不當即刷新,但layoutSubViews必定會被調用.
相關文章
相關標籤/搜索