http://www.it165.net/pro/html/201506/44038.html
-
ChildViewController的应用
viewControlle中可以添加多个subView,在需要的时候显示出来;另一种方法是通过向parentViewController中可以添加多个childCiewController;来控制页面中的subView,降低代码耦合度;通过切换子视图控制器,可以显示不同的view;,替代之前的addSubView的管理。
本节通过类似百度新闻模块切换的界面来演示ChileViewController的应用:
文档结构:

代码演示:
001.#import"MainViewController.h"002.#import"FirstViewController.h"003.#import"SecondViewController.h"004.#import"ThirdViewController.h"005.@interfaceMainViewController ()006.@property(nonatomic, strong) FirstViewController *firstVC;007.@property(nonatomic, strong) SecondViewController *secondVC;008.@property(nonatomic, strong) ThirdViewController *thirdVC;009.@property(nonatomic, strong) UIViewController *currentVC;010.011.@property(nonatomic, strong) UIScrollView *headScrollView;012.@property(nonatomic, strong) NSMutableArray *itemArray;013.@property(nonatomic, strong) UIView *contentView;014.@end015.016.@implementationMainViewController017.- (void)loadView{018.[superloadView];019.[self initialization];020.}021.022.- (void)viewDidLoad {023.[superviewDidLoad];024.[self loadBaseUI];025.}026.027.- (void)initialization{028._itemArray = [NSMutableArray arrayWithObjects:@"头条",@"今日",@"焦点", nil];029.}030.031.- (void)loadBaseUI{032.self.title = @"首页";033._headScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0,0, [UIScreen mainScreen].bounds.size.width,44)];034._headScrollView.backgroundColor = [UIColor colorWithWhite:0.902alpha:1.000];035.for(inti =0; i<_itemArray.count; i++) {036.UIButton *itemButton = [[UIButton alloc]initWithFrame:CGRectMake(i*([UIScreen mainScreen].bounds.size.width/_itemArray.count),0, [UIScreen mainScreen].bounds.size.width/_itemArray.count,44)];037.itemButton.tag =100+i;038.itemButton.backgroundColor = [UIColor clearColor];039.NSDictionary *dic = @{NSForegroundColorAttributeName:[UIColor purpleColor],NSFontAttributeName:[UIFont systemFontOfSize:14.0f]};040.[itemButton setAttributedTitle:[[NSAttributedString alloc]initWithString:_itemArray[i] attributes:dic] forState:UIControlStateNormal];041.[itemButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];042.[_headScrollView addSubview:itemButton];043.}044.[_headScrollView setContentSize:CGSizeMake([UIScreen mainScreen].bounds.size.width,44)];045._headScrollView.showsHorizontalScrollIndicator = NO;046._headScrollView.showsVerticalScrollIndicator = NO;047.[self.view addSubview:_headScrollView];048.049._contentView = [[UIView alloc]initWithFrame:CGRectMake(0,44, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height -44-64)];050._contentView.backgroundColor = [UIColor clearColor];051.[self.view addSubview:_contentView];052.053.[self addSubControllers];054.}055.056.#pragma mark - privatemethods057.- (void)addSubControllers{058._firstVC = [[FirstViewController alloc]initWithNibName:@"FirstViewController"bundle:nil];059.[self addChildViewController:_firstVC];060.061._secondVC = [[SecondViewController alloc]initWithNibName:@"SecondViewController"bundle:nil];062.[self addChildViewController:_secondVC];063.064._thirdVC = [[ThirdViewController alloc]initWithNibName:@"ThirdViewController"bundle:nil];065.[self addChildViewController:_thirdVC];066.067.//调整子视图控制器的Frame已适应容器View068.[self fitFrameForChildViewController:_firstVC];069.//设置默认显示在容器View的内容070.[self.contentView addSubview:_firstVC.view];071.072.NSLog(@"%@",NSStringFromCGRect(self.contentView.frame));073.NSLog(@"%@",NSStringFromCGRect(_firstVC.view.frame));074.075._currentVC = _firstVC;076.}077.078.- (void)buttonClick:(UIButton *)sender{079.if((sender.tag ==100&& _currentVC == _firstVC) || (sender.tag ==101&& _currentVC == _secondVC) || (sender.tag ==102&& _currentVC == _thirdVC)) {080.return;081.}082.switch(sender.tag) {083.case100:{084.[self fitFrameForChildViewController:_firstVC];085.[self transitionFromOldViewController:_currentVC toNewViewController:_firstVC];086.}087.break;088.case101:{089.[self fitFrameForChildViewController:_secondVC];090.[self transitionFromOldViewController:_currentVC toNewViewController:_secondVC];091.}092.break;093.case102:{094.[self fitFrameForChildViewController:_thirdVC];095.[self transitionFromOldViewController:_currentVC toNewViewController:_thirdVC];096.}097.break;098.}099.}100.101.- (void)fitFrameForChildViewController:(UIViewController *)chileViewController{102.CGRect frame = self.contentView.frame;103.frame.origin.y =0;104.chileViewController.view.frame = frame;105.}106.107.//转换子视图控制器108.- (void)transitionFromOldViewController:(UIViewController *)oldViewControllertoNewViewController:(UIViewController *)newViewController{109.[self transitionFromViewController:oldViewController toViewController:newViewController duration:0.3options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {110.if(finished) {111.[newViewController didMoveToParentViewController:self];112._currentVC = newViewController;113.}else{114._currentVC = oldViewController;115.}116.}];117.}118.119.//移除所有子视图控制器120.- (void)removeAllChildViewControllers{121.for(UIViewController *vc in self.childViewControllers) {122.[vc willMoveToParentViewController:nil];123.[vc removeFromParentViewController];124.}125.}126.127./**128.* 方法说明:129.* 1、addChildViewController:向父VC中添加子VC,添加之后自动调用willMoveToParentViewController:父VC130.* 2、removeFromParentViewController:将子VC从父VC中移除,移除之后自动调用131.didMoveToParentViewController:nil132.* 3、willMoveToParentViewController: 当向父VC添加子VC之后,该方法会自动调用。若要从父VC移除子VC,需要在移除之前调用该方法,传入参数nil。133.* 4、didMoveToParentViewController: 当向父VC添加子VC之后,该方法不会被自动调用,需要显示调用告诉编译器已经完成添加(事实上不调用该方法也不会有问题,不太明白); 从父VC移除子VC之后,该方法会自动调用,传入的参数为nil,所以不需要显示调用。134.*/135.136./**137.* 注意点:138.要想切换子视图控制器a/b,a/b必须均已添加到父视图控制器中,不然会报错139.*/140.@end最终效果:(实现了3个视图之间的切换)

本文介绍如何利用ChildViewController实现不同视图间的平滑切换,通过实例演示了添加及管理子视图控制器的方法,降低了代码耦合度。
124

被折叠的 条评论
为什么被折叠?



