使用addChildViewController手动控制UIViewController的切换
来源:互联网 发布:运营商大数据 编辑:程序博客网 时间:2024/06/06 16:57
addChildViewController
If the new child view controller is already the child of a container view controller, it is removed from that container before being added.
This method is only intended to be called by an implementation of a custom container view controller. If you override this method, you must call super in your implementation.
如果这个子 view controller 已经被添加到了一个容器 controller 当中,那在它被添加进新的容器controller之前会从旧的容器中移除.
这个方法只能被用来实现一个自定义的容器controller添加子controller.如果你重写了这个方法,你必须调用super方法.
使用源码:
AppDelegate.h + AppDelegate.m
#import <UIKit/UIKit.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@end
#import "AppDelegate.h"#import "RootViewController.h"@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 加载根视图控制器 self.window.rootViewController = [RootViewController new]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES;}@end
RootViewController.h + RootViewController.m
#import <UIKit/UIKit.h>@interface RootViewController : UIViewController@end
#import "RootViewController.h"#import "FirstViewController.h"#import "SecondViewController.h"// 获取当前屏幕尺寸#define SCR_HEIGHT [UIScreen mainScreen].bounds.size.height// 设置按钮高度static CGFloat downLenth = 40.f;// 标示button的枚举值typedef enum{ BUTTON_1 = 0x11, BUTTON_2,} EFlags;@interface RootViewController (){ UIViewController *currentVC; }@property (nonatomic, strong) UIView *showArea; // 加载子controller的view@property (nonatomic, strong) FirstViewController *firstVC; // 子controller@property (nonatomic, strong) SecondViewController *secondVC; // 子controller@end@implementation RootViewController- (void)viewDidLoad{ [super viewDidLoad]; // 初始化控制器 [self controllersInit]; // 初始化要展示的区域 [self showAreaInit]; // 初始化按钮 [self buttonsInit];}#pragma mark - 初始化控制器- (void)controllersInit{ // 初始化两个控制器并作为root控制器的subController _firstVC = [FirstViewController new]; [self addChildViewController:_firstVC]; [_firstVC didMoveToParentViewController:self]; _secondVC = [SecondViewController new]; [self addChildViewController:_secondVC]; [_secondVC didMoveToParentViewController:self];}#pragma mark - 初始化要展示的区域- (void)showAreaInit{ // 初始化要展示的区域 self.showArea = [UIView new]; self.showArea.frame = CGRectMake(0, 0, 320, SCR_HEIGHT - downLenth - 10); self.showArea.layer.masksToBounds = YES; [self.view addSubview:_showArea]; // 将第一个控制器的view添加进来展示 [self.showArea addSubview:_firstVC.view]; currentVC = _firstVC;}#pragma mark - 初始化按钮以及按钮事件- (void)buttonsInit{ UIButton *firstVCButton = [UIButton new]; [self.view addSubview:firstVCButton]; firstVCButton.backgroundColor = [UIColor redColor]; firstVCButton.tag = BUTTON_1; firstVCButton.frame = CGRectMake(0, SCR_HEIGHT - downLenth, 320 / 2, downLenth); [firstVCButton addTarget:self action:@selector(buttonsEvent:) forControlEvents:UIControlEventTouchUpInside]; UIButton *secondVCButton = [UIButton new]; [self.view addSubview:secondVCButton]; secondVCButton.backgroundColor = [UIColor yellowColor]; secondVCButton.tag = BUTTON_2; secondVCButton.frame = CGRectMake(320 / 2, SCR_HEIGHT - downLenth, 320 / 2, downLenth); [secondVCButton addTarget:self action:@selector(buttonsEvent:) forControlEvents:UIControlEventTouchUpInside];}- (void)buttonsEvent:(UIButton *)button{ if (button.tag == BUTTON_1) { if (currentVC == _firstVC) { return; } [self transitionFromViewController:currentVC toViewController:_firstVC duration:0 options:UIViewAnimationOptionTransitionNone animations:^{ } completion:^(BOOL finished) { currentVC = _firstVC; }]; } if (button.tag == BUTTON_2) { if (currentVC == _secondVC) { return; } [self transitionFromViewController:currentVC toViewController:_secondVC duration:0 options:UIViewAnimationOptionTransitionNone animations:^{ } completion:^(BOOL finished) { currentVC = _secondVC; }]; }}@end
FirstViewController.h + FirstViewController.m
#import <UIKit/UIKit.h>@interface FristViewController : UIViewController@end
#import "FristViewController.h"@interface FristViewController ()@end@implementation FristViewController- (void)viewDidLoad{ [super viewDidLoad]; NSLog(@"FirstViewController viewDidLoad");}- (void)viewWillAppear:(BOOL)animated{ NSLog(@"FirstViewController viewWillAppear");}- (void)viewDidAppear:(BOOL)animated{ NSLog(@"FirstViewController viewDidAppear");}- (void)viewWillDisappear:(BOOL)animated{ NSLog(@"FirstViewController viewWillDisappear");}- (void)viewDidDisappear:(BOOL)animated{ NSLog(@"FirstViewController viewDidDisappear");}@end
SecondViewController.h + SecondViewController.m
#import <UIKit/UIKit.h>@interface SecondViewController : UIViewController@end
#import "SecondViewController.h"@interface SecondViewController ()@end@implementation SecondViewController- (void)viewDidLoad{ [super viewDidLoad]; NSLog(@"SecondViewController viewDidLoad");}- (void)viewWillAppear:(BOOL)animated{ NSLog(@"SecondViewController viewWillAppear");}- (void)viewDidAppear:(BOOL)animated{ NSLog(@"SecondViewController viewDidAppear");}- (void)viewWillDisappear:(BOOL)animated{ NSLog(@"SecondViewController viewWillDisappear");}- (void)viewDidDisappear:(BOOL)animated{ NSLog(@"SecondViewController viewDidDisappear");}@end
需要注意的地方:
1. 容器controller最好定义一个专门用来展示子controller相关view的区域,如例子中的,其中,masksToBounds很重要,要不然,整个controller都会被展示出来的.
self.showArea = [UIView new];
self.showArea.frame = CGRectMake(0, 0, 320, SCR_HEIGHT - downLenth - 10);
self.showArea.layer.masksToBounds = YES;
[self.view addSubview:_showArea];
[self.showArea addSubview:_firstVC.view];
2. 调用完addChildViewController之后还需要调用didMoveToParentViewController,官方文档里面有说明.
3. 为什么在点击一个按钮切换控制器的时候,showArea什么都不用设置,为何还能显示出变化呢?
其实这一点我也没弄明白为何呢.
4. 这个与UITabbarController的功能类似,都有懒加载功能,实际上可以用来当做模拟UITabbarController使用,具备更高自由度的定制Tabbar的功能.
- 使用addChildViewController手动控制UIViewController的切换
- 使用addChildViewController手动控制UIViewController的切换
- 使用addChildViewController手动控制UIViewController的切换
- UIViewController 的addChildViewController:(UIViewController *) 方法
- ios5中UIViewController addChildViewController新方法的使用[转]
- 试图切换控制addChildViewController、_transitionFromViewController
- 浅谈UIViewController 使用-addChildViewController自定义视图控制器
- iOS5中UIViewController的新方法 addChildViewController
- iOS5中UIViewController的新方法addChildViewController
- 16-UIViewController 手动控制旋转
- addChildViewController的使用
- UIViewController中addChildViewController的坑:viewWillAppear不调用
- UIViewController的切换方式
- UIViewController的切换效果
- 160319 addChildViewController&transitionFromViewController的使用
- 控制UIViewController的生命周期
- 使用 Storyboard Segue 实作 UIViewController 的切换
- 使用 Storyboard Segue 实作 UIViewController 的切换 (实例)
- 集中式版本控制SVN使用
- 解析URL中的键值对
- 1013 字符串按位相加取单整数
- Github使用指南
- 进入BIOS设置启动项的快捷键
- 使用addChildViewController手动控制UIViewController的切换
- C++ 中const作用
- 黑马程序员:java基础知识(一)
- 最简单的linux线程创建、共享变量
- 适配iOS6与iOS7
- 学习日志
- 第三十一讲 : DataSet和DataAdapter(上)
- IOS plist文件
- 线程池