1

视图控制器与通知

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会调用父类的方法

各个方法执行顺序

        - (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);
}
}
```


Dear宅学长
63 声望4 粉丝

仔仔


« 上一篇
iOS基础(二)
下一篇 »
注释头

引用和评论

0 条评论