一个控制器包含其余一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 (Child View Controller)。UINavigationController、UITabBarController 是经常使用的容器控制器。本文介绍自定义容器控制器的方法。html
- (void)displayContentController:(UIViewController *)content { [self addChildViewController:content]; content.view.frame = [self frameForContentController]; [self.view addSubview:self.currentClientView]; [content didMoveToParentViewController:self]; }
注意,容器控制器的 addChildViewController: 方法会调用子控制器的 willMoveToParentViewController: 方法,所以不须要写子控制器的 willMoveToParentViewController: 方法。ios
- (void)hideContentController:(UIViewController *)content { [content willMoveToParentViewController:nil]; [content.view removeFromSuperview]; [content removeFromParentViewController]; }
注意,子控制器的 removeFromParentViewController 方法会调用 didMoveToParentViewController: 方法,不用写 didMoveToParentViewController: 方法。git
- (void)cycleFromViewController:(UIViewController *)oldVC toViewController:(UIViewController *)newVC { // Prepare the two view controllers for the change. [oldVC willMoveToParentViewController:nil]; [self addChildViewController:newVC]; // Get the start frame of the new view controller and the end frame // for the old view controller. Both rectangles are offscreen. newVC.view.frame = [self newViewStartFrame]; CGRect endFrame = [self oldViewEndFrame]; // Queue up the transition animation. [self transitionFromViewController:oldVC toViewController:newVC duration:0.25 options:0 animations:^{ // Animate the views to their final positions. newVC.view.frame = oldVC.view.frame; oldVC.view.frame = endFrame; } completion:^(BOOL finished) { // Remove the old view controller and send the final // notification to the new view controller. [oldVC removeFromParentViewController]; [newVC didMoveToParentViewController:self]; }]; }
容器控制器的 transitionFromViewController:toViewController:duration:options:animations:completion: 方法将 newVC 的 view 添加进来,执行动画 animations block,动画结束就移除 oldVC 的 view。github
- (BOOL)shouldAutomaticallyForwardAppearanceMethods { return NO; }
若是加上这一句,容器控制器就要在子控制出现和消失时通知子控制器,分别经过调用子控制器的 beginAppearanceTransition:animated: 方法和 endAppearanceTransition() 方法实现,不要直接调用子控制器的 viewWillAppear:、viewDidAppear:、viewWillDisappear:、viewDidDisappear: 方法。app
重载 childViewControllerForStatusBarStyle 属性,返回相应的子控制器,让子控制器决定状态栏样式。当这个属性发生变化,调用 setNeedsStatusBarAppearanceUpdate() 方法更新状态栏样式。ide
容器控制器能够用子控制器的 preferredContentSize 属性决定子控制器 view 的大小。动画
https://github.com/ViewDeck/ViewDeck3d
左右侧滑视图,实现侧滑菜单功能。code
https://github.com/Silence-GitHub/SWScrollViewControllerhtm
Scroll view 里加入子控制器的视图,能左右滑动切换子控制器。
https://github.com/Silence-GitHub/SWSegmentedController
经过 UISegmentedControl 切换子控制器。
转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6370049.html