UIViewController之[自定義容器視圖控制器]

1.簡介

Container的主要職責就是管理一個或多個Child View Controller的展現的生命週期,須要傳遞顯示以及旋轉相關的回調html

一個app首先有一個主window,window指定一個rootViewControllerapp

window會將相關的回調傳遞給rootViewController函數

rootViewController須要再將這些callbacks的調用傳遞給它的Child View Controllers動畫

顯示相關的回調:appearance callbacks(
          viewWillAppear:
          viewWillDisappear:
          viewDidAppear:
          viewDidDisappear: 
)
旋轉相關的回調:rotation callbacks(
          willRotateToInterfaceOrientation:duration: 
          willAnimateRotationToInterfaceOrientation:duration:,
          didRotateFromInterfaceOrientation:
)

2.父子關係(parentViewController--subViewController)

實現一個Custom Container View Controller分爲兩個階段.net

①父子關係的創建

②️父子關係的解除
2.1創建父子關係
//將subViewController添加爲child view controller,addChildViewController:接口創建了邏輯上的父子關係
    //子能夠經過parentViewController,訪問其父VC
    //addChildViewController:接口的邏輯中會自動調用 [subViewController willMoveToParentViewController : parentViewController]; 
    [parentViewController addChildViewController : subViewController];

    //創建父子關係後,即是將content的view加入到父VC的view hierarchy(層次結構)上
    [parentViewController.view addSubview : subViewController.view];

    //調用child的 didMoveToParentViewController: ,以通知child,完成了父子關係的創建
    [subViewController didMoveToParentViewController : parentViewController];
2.2解除父子關係
//通知child,即將解除父子關係
    [self willMoveToParentViewController:nil];

    //將child的view從父VC的view的hierarchy中移除
    [self.view removeFromSuperview];

    //經過removeFromParentViewController的調用真正的解除關係
    //removeFromParentViewController會自動調用 [content didMoveToParentViewController:nil]
    [self removeFromParentViewController];

3. appearance callbacks的傳遞

生命週期:code

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> deallochtm

其實,callbacks系統會自動調用,可是有些需求自動調用不能知足需求,如:blog

child view的展現有一個動畫的過程,這個時候咱們並不想viewDidAppear的調用在addSubview的時候進行,而是等展現動畫結束後再調用viewDidAppear。接口

自定義容器中須要關閉自動調用callbacks,本身去控制callbacks的調用時機生命週期

3.1如何關閉自動傳遞:
IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
        return NO;
    IOS6+:shouldAutomaticallyForwardAppearanceMethods
        return NO;
3.2手動傳遞

手動傳遞須要用到一下兩個方法, 並且必須成對出現

beginAppearanceTransition:animated:

endAppearanceTransition
//觸發subViewController的viewWillAppear
    [subViewController beginAppearanceTransition:YES animated:animated];           
    
    //觸發subViewController的viewWillDisappear
    [subViewController beginAppearanceTransition:NO animated:animated];

    //觸發對應的viewDidAppear和viewDidDisappear
    [subViewController endAppearanceTransition];
例子
/**
*將subViewController添加入parentViewController中
*調用該方法後,能夠添加子控制器顯示時的動畫效果
*/
-(void)addToParentViewContoller:(UIViewController *)parentViewController subViewController:(UIViewController*)subViewController{
    [subViewController beginAppearanceTransition:YES animated:animated]; 

    [parentViewController addChildViewController : subViewController];
    [parentViewController.view addSubview : subViewController.view];
    [subViewController didMoveToParentViewController : parentViewController];

    [subViewController endAppearanceTransition];     
}

/**
* 將subViewController從parentViewController中刪除
*/
-(void)removeFromParentViewContoller:(UIViewController *)parentViewController subViewController:(UIViewController*)subViewController{
    [subViewController beginAppearanceTransition:NO animated:animated]; 

    [subViewController willMoveToParentViewController:nil];
    [subViewController.view removeFromSuperview];
    [subViewController removeFromParentViewController];

    [subViewController endAppearanceTransition];     
}

4. rotation callbacks的傳遞

轉屏時纔會須要關注的問題

4.1如何關閉自動傳遞:
IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
        return NO;
    IOS6+:shouldAutomaticallyForwardRotationMethods
        return NO;

轉屏時觸發的函數:請參照以下連接:

轉屏時觸發函數 http://my.oschina.net/u/2462423/blog/523235#OSC_h3_6

更多詳細內容請參照以下連接:

更多詳細內容 http://www.cocoachina.com/industry/20140523/8528.html

相關文章
相關標籤/搜索