文章目录
  1. 1. UIViewController
  2. 2. 视图控制器与视图的关系
  3. 3. 视图控制器(UIViewController)的创建
  4. 4. UIViewController生命周期
    1. 4.1. 加载过程
    2. 4.2. 各个方法执行顺序
  5. 5. 视图卸载
  6. 6. 试图控制器的响应链
  7. 7. 模态视图
  8. 8. 支持多个方向

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
// 代码创建
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内存紧张的时候调用
  1. viewWillDisappear 视图将被从屏幕上移除之前执行
  2. viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图
  3. 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);
    }
    }
文章目录
  1. 1. UIViewController
  2. 2. 视图控制器与视图的关系
  3. 3. 视图控制器(UIViewController)的创建
  4. 4. UIViewController生命周期
    1. 4.1. 加载过程
    2. 4.2. 各个方法执行顺序
  5. 5. 视图卸载
  6. 6. 试图控制器的响应链
  7. 7. 模态视图
  8. 8. 支持多个方向