UIViewController 介绍
◊ 视图控制器就像一个大管家, 用来管理视图加载, 卸载, 横屏竖屏显示等操作
◊ 每一个界面都应该由一个控制器来管理
◊ UIViewController是所有视图控制器的父类
◊ IOS 提供了许多内置的视图控制器类, 以支持标准的用户界面部分, 比
√ 如导航控制器 ( UINavigationController )
√ 标签栏控制器 ( UITabBarController )
√ 表视图控制器 ( UITabViewController )
视图控制器与视图关系
◊ 视图控制器是传统的Model-View-Controller ( MVC ) 设计模式中 ---- 控制器
◊ 视图控制器提供了许多控制器的基本功能, 因为它是所有控制器的基类
◊ 视图控制器负责创建和管理一组视图, 它本身就提供了一个视图, 称为该控制器的跟视图, 协调管理数据和视图之间的交互
视图控制器管理视图
◊ 每个视图控制器管理和控制一系列的视图
◊ 不要直接把UIView添加到UIWindow上面, 而是添加一个UIViewController.
UIViewController 的创建
◊ 代码创建视图
◊ 使用xib 的方式创建视图
∆ 代码方式创建:
// 创建每个控制器的根视图
UIView *rootView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.view = rootView;
self.view.backgroundColor = [UIColor redColor];
[rootView release];
∆ 使用 xib 的方式创建
RootViewController *rootCtrl = [[RootViewController alloc] initWithNibName:@"RootViewControllerBak" bundle:nil];
self.window.RootViewController = rootCtrl;
[rootCtrl release];
注意事项:
视图控制器的xib文件,是在UIViewController的loadView中加载此xib文件的
如果此控制器的视图由xib创建的,则不要覆写loadView方法,这样会导致xib无法加载
视图的加载
◊ 视图控制器 loadView 方法 的调用时机
√ 调用了 view 的访问器
√ 视图控制器的 view 为空
RootViewController *rootCtrl = [[RootViewControlleralloc] init];
//调用了view的访问器,并且view为nil,此时会调用loadView方法
UIView *view = rootCtrl.view;
◊ 覆盖 父类中的loadView 方法
- (void)loadView {
//loadView不要调用父类的loadView
// [super loadView];
UIView *view = [[UIViewalloc] initWithFrame:CGRectMake(0, 20, 320, 480-20)];
self.view = view;
[view release];
}
设置支持方向旋转
修改 info.plist 文件如下标记设置支持的旋转方向
6.0之前使用shouldAutorotateToInterfaceOrientation方法来控制方向
6.0之后使用supportedInterfaceOrientations方法来控制方向
//6.0之前设备旋转调用的方法
//参数:toInterfaceOrientation 表示当前设备所处的方向
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
if (toInterfaceOrientation == UIInterfaceOrientationPortrait | toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ) {
if (toInterfaceOrientation == UIInterfaceOrientationPortrait) {
subView1.frame = CGRectMake(10, 10, 100, 50);
subView2.frame = CGRectMake(10, 160, 100, 50);
subView3.frame = CGRectMake(10, 300, 100, 50);
} else if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
subView1.frame = CGRectMake(10, 10, 100, 50);
subView2.frame = CGRectMake(10, 100, 100, 50);
subView3.frame = CGRectMake(10, 200, 100, 50);
}
return YES;
}
return NO;
}
//6.0之后设置当前控制器界面所支持的方向
- (NSUInteger)supportedInterfaceOrientations {
//获取到状态栏的方向,也就是设备的方向
UIInterfaceOrientation interface = [UIApplicationsharedApplication].statusBarOrientation;
if (interface == UIInterfaceOrientationPortrait) {
subView1.frame = CGRectMake(10, 10, 100, 50);
subView2.frame = CGRectMake(10, 160, 100, 50);
subView3.frame = CGRectMake(10, 300, 100, 50);
} elseif(interface == UIInterfaceOrientationLandscapeLeft) {
subView1.frame = CGRectMake(10, 10, 100, 50);
subView2.frame = CGRectMake(10, 100, 100, 50);
subView3.frame = CGRectMake(10, 200, 100, 50);
}
//返回朝向的枚举值
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}
模态视图
◊ 通过视图控制器的presentModalViewController: 方法弹出的视图我们称为模态视图
◊ 模态视图出现的场景一般是临时弹出的窗口, 譬如: 登陆窗口
◊ 模态视图弹出时通过modalTransitionStyle属性设置不同的动画效果
◊ 调用dismissModalViewControllerAnimated: 方法关闭窗口
∆ 弹出模态视图
//设置弹出的动画效果
modalCtrl.modalTransitionStyle = UIModalTransitionStylePartialCurl;
//此方法是ios6.0之后新加的方法,如果使用的话,需要考虑版本兼容性问题
[selfpresentViewController:modalCtrlanimated:YEScompletion:NULL];
//此方法6.0之后不建议使用的方法
// [self presentModalViewController:modalCtrl animated:YES];
[self.viewaddSubview:modalCtrl.view];
∆ 关闭模态视图
//关闭当前模态视图
// [self dismissModalViewControllerAnimated:YES];
// 相当于
// [self.view removeFromSuperview];
//6.0之后的
[selfdismissViewControllerAnimated:YEScompletion:NULL];
Appear这组方法的调用时机:
当前控制器视图被添加到另一个视图上显示时调用
[self.view addSubview:modalCtrl.view];
viewWillAppear: 和 viewDidAppear:
//此控制器的视图将要出现在屏幕上时调用
- (void)viewWillAppear:(BOOL)animated {
[superviewWillAppear:animated];
NSLog(@"viewWillAppear");
}
//此控制器的视图已经出现在屏幕上时调用
- (void)viewDidAppear:(BOOL)animated {
[superviewDidAppear:animated];
NSLog(@"viewDidAppear");
}
Disappear这组方法调用的时机:
当前视图控制器视图被移除时调用
[self.view removeFromSuperview];
viewWillDisappear: 和 viewDidDisappear:
//视图将要消失时调用
- (void)viewWillDisappear:(BOOL)animated {
[superviewWillDisappear:animated];
NSLog(@"viewWillDisappear");
}
//视图已经消失时调用
- (void)viewDidDisappear:(BOOL)animated {
[superviewDidDisappear:animated];
NSLog(@"viewDidDisappear");
}