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: )
实现一个Custom Container View Controller分为两个阶段.net
①父子关系的创建 ②️父子关系的解除
//将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];
//通知child,即将解除父子关系 [self willMoveToParentViewController:nil]; //将child的view从父VC的view的hierarchy中移除 [self.view removeFromSuperview]; //经过removeFromParentViewController的调用真正的解除关系 //removeFromParentViewController会自动调用 [content didMoveToParentViewController:nil] [self removeFromParentViewController];
生命周期:code
alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> deallochtm
其实,callbacks系统会自动调用,可是有些需求自动调用不能知足需求,如:blog
child view的展现有一个动画的过程,这个时候咱们并不想viewDidAppear的调用在addSubview的时候进行,而是等展现动画结束后再调用viewDidAppear。接口
自定义容器中须要关闭自动调用callbacks,本身去控制callbacks的调用时机生命周期
IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers return NO; IOS6+:shouldAutomaticallyForwardAppearanceMethods return NO;
手动传递须要用到一下两个方法, 并且必须成对出现
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]; }
转屏时才会须要关注的问题
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