视图控制器与通知
UIViewController
- 视图控制器是数据和视图之间的桥梁,视图供职器提供了一个基本的框架来构建应用程序。
- UIViewController是所有视图控制器的父类
- iOS提供了许多内置的视图控制器,以支持标准的用户界面部分,比如导航控制器
UINavigationController
,标签栏控制器UITabBarController
,表视图控制器UITableViewController
等
视图控制器与视图的关系
- 视图控制器是传统Modle-View-Controller(MVC)设计模式中————控制器对象
- 视图控制器提供了许多控制器的基本功能
- 对于某些功能,基类提供了解决方案的一部分,其他的自定义的功能由视图控制器的子类去实现,比如:用户选择设备,可以由子类去控制是否旋转
- 视图控制器负责创建和管理一组视图,它本身提供一个视图,称为该试图控制器的根视图,协调管理数据的视图之间的交互
- UIScreen对象时链接物理屏幕的标示
- UIWindow为UIScreen对象提供画布
- 一组UIView对象就可以显示内容
- 每个视图控制器管理和控制一系列的视图
- 永远不要把UIView添加到UIWindow上,二是添加一个UIViewController
视图控制器(UIViewController)的创建
```Objective-C
// 代码创建
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生命周期
![](https://github.com/zt1991616/blog/raw/master/Image/Load.jpg)
```Objective-c
-(void)loadView
{
// 调用父类来创建view
// 从nib、storybord加载View,否则创建一个empty view
// 创建一个自定义的视图,覆盖即可
}
-(void)view
加载过程
- 首先去访问view属性
- 如果存在view,判断之间加载。否则,则UIViewCtroller调用loadView方法
- loadView方法执行如下操作
- 如果覆盖了该方法,则必须创建View给UIViewCtroller的View属性
- 如果没有覆盖该方法,UIViewControlller会调用父类的方法
- loadView方法执行如下操作
各个方法执行顺序
- (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
内存紧张的时候调用
1. viewWillDisappear 视图将被从屏幕上移除之前执行
2. viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图
3. dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
试图控制器的响应链
- 事件传递流程
当前触发的事件->视图控制器的跟视图->视图控制器->窗口->UIApplication对象->不处理
模态视图
- 模态视图不是特定的某个类,而是通过视图控制器的pressntModalViewController:方法弹出的视图称为模态视图
- 模态视图出现的场景一般是临时弹出的窗口,譬如:登入窗口
- 模态视图弹出时通过modalTransitionStyle属性设置不同的动画效果
- 调用dismissModalViewControllerAnimated:方法关闭窗口
```Objective-c
-(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];
}
}
```Objective-c
//ModalViewController.m
-(void)dismiss
{
// 将模态视图关闭
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"dismiss")];
}];
}
支持多个方向
- iOS设备中的加速计可以确定设备的当前方向。默认情况下,一个应用支持纵向和横向。当设备方向改变时,系统会发送UIDiviceOrientationDidChangeNotfication通知,默认情况下UIKit框架监听这个通知,并自定义更新这个方向。
```Objective-c
-(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);
}
}
```
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。