UIViewController
- 视图控制器是数据和视图之间的桥梁,视图供职器提供了一个基本的框架来构建应用程序。
- UIViewController是所有视图控制器的父类
- iOS提供了许多内置的视图控制器,以支持标准的用户界面部分,比如导航控制器
UINavigationController,标签栏控制器UITabBarController,表视图控制器UITableViewController等
视图控制器与视图的关系
- 视图控制器是传统Modle-View-Controller(MVC)设计模式中————控制器对象
- 视图控制器提供了许多控制器的基本功能
- 对于某些功能,基类提供了解决方案的一部分,其他的自定义的功能由视图控制器的子类去实现,比如:用户选择设备,可以由子类去控制是否旋转
- 视图控制器负责创建和管理一组视图,它本身提供一个视图,称为该试图控制器的根视图,协调管理数据的视图之间的交互
- UIScreen对象时链接物理屏幕的标示
- UIWindow为UIScreen对象提供画布
- 一组UIView对象就可以显示内容
- 每个视图控制器管理和控制一系列的视图
- 永远不要把UIView添加到UIWindow上,二是添加一个UIViewController
视图控制器(UIViewController)的创建
1 2 3 4 5 6 7 8
| // 代码创建 UIViewController *mainViewController = [[UIViewCtroller alloc] init]; mainViewController.view.backgroundColor = [UIColor redColor]; self.window.rootViewController = mainViewCtroller; // nib创建 RootViewController *rootViewController = [[RootViewController alloc] initWithNibName:@"view" bundle:nil]; self.window.rootViewController = rootViewController;
|
UIViewController生命周期

1 2 3 4 5 6 7
| -(void)loadView { // 调用父类来创建view // 从nib、storybord加载View,否则创建一个empty view // 创建一个自定义的视图,覆盖即可 } -(void)view
|
加载过程
- 首先去访问view属性
- 如果存在view,判断之间加载。否则,则UIViewCtroller调用loadView方法
- loadView方法执行如下操作
- 如果覆盖了该方法,则必须创建View给UIViewCtroller的View属性
- 如果没有覆盖该方法,UIViewControlller会调用父类的方法
各个方法执行顺序
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
- (void)loadView
- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated
- (void)viewWillDisappear:(BOOL)animated
- (void)viewDidDisappear:(BOOL)animated
视图卸载

- iOS6之前使用
viewDidUnload:方法来释放对象的引用
- iOS6之后使用
didRecevelMemoryWarning内存紧张的时候调用
- viewWillDisappear 视图将被从屏幕上移除之前执行
- viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图
- dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
试图控制器的响应链
- 事件传递流程
当前触发的事件->视图控制器的跟视图->视图控制器->窗口->UIApplication对象->不处理
模态视图
- 模态视图不是特定的某个类,而是通过视图控制器的pressntModalViewController:方法弹出的视图称为模态视图
- 模态视图出现的场景一般是临时弹出的窗口,譬如:登入窗口
- 模态视图弹出时通过modalTransitionStyle属性设置不同的动画效果
- 调用dismissModalViewControllerAnimated:方法关闭窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| -(void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor purpleColor]; UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundeRect]; button.frame = CGRectMake(320/2 - 140/2,80,140,40); [button setTitle:@"Present" forState:UIControlStateNormal]; [button addTarget:self action:@selector[presentModalVc] forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; } -(void)presentModalVC { ModalViewController *modalVc = [[ModalViewController alloc] init]; // 动画效果 modalVc.modalTranstionSyle = UIModalTransitionStylePatialCurl; if([[UIDevice currentDevice].systemVersion floatValue] < 6.0){ [self.presentModalViewController:modalVc animated:YES]; }else{ [self.presentModalViewController:modalVc animated:YES completion:^{ NSLog(@"call back"); }]; [modalVC relese]; } }
|
1 2 3 4 5 6 7 8
| //ModalViewController.m -(void)dismiss { // 将模态视图关闭 [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"dismiss")]; }]; }
|
支持多个方向

- iOS设备中的加速计可以确定设备的当前方向。默认情况下,一个应用支持纵向和横向。当设备方向改变时,系统会发送UIDiviceOrientationDidChangeNotfication通知,默认情况下UIKit框架监听这个通知,并自定义更新这个方向。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| -(void)viewDidLoad { // ... // 采用通知获取屏幕方向切换 [[UINotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientation:)name:UIDeviceOrientationDidChangeNotifitation object:nil]; } -(void)deviceOrientation:(NSNotification *)notification { UIDevice *device = (UIDevice *)[notification object]; NSLog(@"device:%d",device.orientation); } -(BOOL)shoudlAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return NO; //NO为不支持 // return (toInterfaceOrientation != UIterfaceOrientationLandscapeLeft); // 不支持一个方向 } # pragma mark - Orientation iOS 3.0_5.0 -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrienttation)toInterfaceOrientation { return NO; } # pragma mark - Orientation iOS 6.0 -(BOOL)shouldAutorotate { return YES; } -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { NSLog(@"duration:%f",duration); UIView* button = [self.view viewWithTag:101]; if(toInterfaceOrientation == UIInterfaceOrientationPortrait){ button.frame = CGRectMake(320/2-140/2,80,140,40); }else{ button.frame = CGRectMake(480/2-140/2,80,140,40); } }
|