• UIViewController简述


    一.View Controller Classes

    二.自定义UIVIewController

    1.创建

    a)nib文件

    1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
    2. {  
    3.         self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  
    4.         // Override point for customization after application launch.  
    5.         self.firstViewController = [[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:nil] autorelease];  
    6.         self.window.rootViewController = self.firstViewController;  
    7.         self.firstViewController.wantsFullScreenLayout=YES;  
    8.         [self.window makeKeyAndVisible];  
    9.         return YES;  
    10. }  

    如果你自定义controller实现initWithCoder:方法的话则会调用,如果没有实现,则调用init.
    在调用完后,框架会自动调用controller中的objects(一般是UIView)的awakeFromNib方法,让objects可以有机会来初始化自己.

    b)手动创建

    只需要alloc&init方式就可以了

    2.初始化

    一般在controller中实现loadView方法来实现第一次的controller内容的管理,值得注意的是,如果自己实现了这个方法,则不需要调用super的loadView方法

    3.设置root view controller的尺寸

    a)window的尺寸

    b)是否有status bar

    c)设备的方向(横向竖向)

    d)root view controller的wantsFullScreenLayout属性。这个属性就是设置是否要包含状态栏20像素,比方说你在view里设置了一个button在顶部,这个如果是true,则button出现在状态栏下,如果是false,则会自动顶下去。本身并不影响status bar的隐藏和消失。只是决定status bar下面是否属于程序绘制区域而已。

    4.布局

    首先可以利用每个view的autoresizingMask的设置来自动布局

    viewcontroller布局改变的顺序

    a)view controller的vew尺寸改变

    b)调用controller的viewWillLayoutSubview.

    c)调用view的layoutSubview

    d)调用controller的viewDidLayoutSubview.

    三.View Controller的生存周期

    1.初始化方法:init,initWithCoder;

    2.加载controller's view:loadView: controller.view=nil; viewDidLoad: controller.view=view;

    3.当收到didREceiveMemoryWarning的时候会调用viewWillUnload,viewDidUnload;

    4.dealloc:释放资源(ARC可以忽略)

    四.支持界面旋转

    1.声明支持的旋转方向

    shouldAutorotateToInterfaceOrientation:决定支持的旋转方向(UIInterfaceOrientationIsLandscape的横向2个方向 UIInterfaceOrientationIsPortrait竖直2个方向)

    2.如何处理方向改变

    a)方向发生改变

    b)调用shouldAutorotateToInterfaceOrientation查看支持的方向

    c)调用controller的willRotateToInterfaceOrientation:duration方法

    d)触发view的自动布局(详细的看第二部分的第4点:布局)

    e)调用didRotateFromInterfaceOrientation方法

    3.为每个方向创建不同的界面

    利用notification来通知不同的状态。

    1. @implementation PortraitViewController  
    2. - (void)awakeFromNib  
    3. {  
    4.     isShowingLandscapeView = NO;  
    5.     [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];  
    6.     [[NSNotificationCenter defaultCenter] addObserver:self  
    7.                                  selector:@selector(orientationChanged:)  
    8.                                  name:UIDeviceOrientationDidChangeNotification  
    9.                                  object:nil];  
    10. }  
    11.    
    12. - (void)orientationChanged:(NSNotification *)notification  
    13. {  
    14.     UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;  
    15.     if (UIDeviceOrientationIsLandscape(deviceOrientation) &&  
    16.         !isShowingLandscapeView)  
    17.     {  
    18.         [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];  
    19.         isShowingLandscapeView = YES;  
    20.     }  
    21.     else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&  
    22.              isShowingLandscapeView)  
    23.     {  
    24.         [self dismissViewControllerAnimated:YES completion:nil];  
    25.         isShowingLandscapeView = NO;  
    26.     }  
    27. }  

    4.处理旋转的小贴士

    a)暂时禁止任何事件响应

    b)存储已经显示的地图区域(地图应用中)

    c)如果界面的view层次太过复杂而造成延迟,建议先做view的截图,相关方法我其它博客文章中有提到

    d)旋转后,对于tableView的话,需要reload重新读取数据。

    e)使用旋转通知来更新应用信息。

    五.view显示相关的通知

    1.方法有viewWillAppear: viewDidAppear: viewWillDisappear: viewDidAppear:

    2.注意这个是controller.view被设置值或者controller.view被设置成nil调用的,当然这个值未必就是直接设置的,可能是通过controller的显示和移除的。

    3.知道view显示移除的原因,在上述4个方法中调用isMovingFromParentViewController,isMovingToParentViewController,isBeingPresented,isBeingDismissed 。

    六.viewController显示(关闭)其它viewController

    在5.0之前,对应的方法是使用model view controller系列的方法。5.0以后增加了presented,prensentingViewController的概念,modalViewController对应5.0后的presentedViewController

    1. FCDemoViewController *controller= [[FCDemoViewController alloc]initWithNibName:@"FCDemoViewController" bundle:nil];  
    2. controller.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;  
    3. [self presentModalViewController:controller animated:YES];  
    4. NSLog(@"%@",self.modalViewController);  
    5. //5.0   
    6. [self presentViewController:controller animated:YES completion:nil];  
    7. NSLog(@"%@",self.presentedViewController);  
    8. NSLog(@"%@",self.presentingViewController);  

    属性modalPresentationStyle在iPad下有几种显示形式,对应不同的显示区域。属性modellTransitionStyle决定过渡形式.

    关闭也有对应的方法:dismissModalViewControllerAnimated或iOS5.0以后的dismissViewControllerAnimated:completion:

    5.0以后其它的变化:

    controller可以自定义子controller的集合,这样每一个controller都可以是一个container controller.

    definesPresentationContext决定当前显示其它controller的controller是否提供context给presentedViewController(modalViewController),如果不,就会找上一级的controller的该值。

    详细的操作可以查看class reference.

    苹果官方推荐使用协议的方式来让controller相互通信。首先声明一个协议,并在主controller中实现该协议的方法,在显示其它controller的时候,为其设置delegate=self.这样在其它controller需要回调presentingViewController就可以直接用delegate方法来回调到它。通过这样的方式,可以使得复用性大大增强。而且被显示的controller也不用完全知道显示它的controller的所有信息和属性。

    七.controller的edit mode

    1.当设置controller的editing属性,会自动触发setEditing:animated属性,这个时候通过myController editButtonItem获得的编辑按钮会自动从edit变成Done,这个通常使用在navigation Controller

    比如设置一个右上角按钮为editButton的话代码如下

      1. myViewController.navigationItem.rightBarButtonItem=[myViewController editButtonItem];  
  • 相关阅读:
    《梦断代码》阅读笔记01
    linux c netcdf 安装
    Windows CE中的进程和线程
    VC做任务管理器涉及到的函数
    curl_easy_getinfo() -- 从 curl 句柄里获得附加信息
    libcurl programming
    动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
    C++: byte和int的相互转化
    8位灰度图像BMP的保存
    BMP图像的结构及读写和灰度化
  • 原文地址:https://www.cnblogs.com/worldtraveler/p/4554745.html
Copyright © 2020-2023  润新知