码迷,mamicode.com
首页 > Windows程序 > 详细

UIWindow笔记

时间:2016-05-06 19:16:57      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

  Window的作用


  在iOS中,一个window(也就是一个UIWindow对象)主要有这样几个作用:

    1. 展示app的可视内容;
    2. 将事件分发给视图以及其他对象;
    3. 和app的view controller一起处理屏幕旋转。

  其实在大多数情况下,第三方程序员不用做任何事情,window就能完成这些工作。所以很多时候,只有当这个app需要支持另一个外设的屏幕的时候,程序员才会对window进行操作。

  UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow

  iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

  一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow。也就说,没有UIWindow,就看不见任何UI界面

  创建window


  有好几种创建window的方式:

  使用storyboard:

  如果程序员为app创建了一个storyboard,并在info.plist中指定它为main storyboard,那么在app启动的时候,iOS会自动帮程序员做这样几件事情:

  1. 实例化一个window;
  2. 加载main storyboard,并且实例化其中的root view controller;
  3. 将这个view controller赋值给window.rootViewController,并显示这个window。

  使用nib文件:

  如果不使用storyboard,也可以用nib文件来代替。将一个window对象拖拽到Interface Builder文件中,并将这个文件指定为app的main interface。那么在app启动的时候,iOS也会自动创建window对象。
  为了确保window的大小与屏幕大小吻合,需要在Interface Builder中对window对象勾选Full Screen at Launch这个属性。

  手写代码:

  当然也可以通过手写代码的方式创建window。比如官方示例代码:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    myViewController = [[MyViewController alloc] init];
    window.rootViewController = myViewController;
    [window makeKeyAndVisible];

    return YES;
}

  需要注意的是,window的尺寸永远应该是屏幕的尺寸,不应该考虑状态栏等元素,因为这些是view controller应该处理的问题。

 

  如何获取UIWindow

  (1)[UIApplication sharedApplication].windows  在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象(平时输入文字弹出的键盘,就处在一个新的UIWindow中)

  (2)[UIApplication sharedApplication].keyWindow(获取应用程序的主窗口)用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。

    注:经过代码验证,非keyWindow 也是可以接受键盘消息的

    提示:如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow

  (3)view.window获得某个UIView所在的UIWindow

 

  UIWindowLevel

  我们知道UIWindow 有三个层级,分别是Normal ,StatusBar,Alert.输出他们三个层级的值,我们发现从左到右依次是0,1000,2000,也就是说Normal级别是最低的,StatusBar处于中级,Alert级别最高。而通常我们的程序的界面都是处于Normal这个级别的,系统顶部的状态栏应该是处于StatusBar级别,UIActionSheet和UIAlertView这些通常都是用来中断正常流程,提醒用户等操作,因此位于Alert级别。

  根据window显示级别优先原则,级别高的会显示在最上层,级别低的在下面,我们程序正常显示的view在最底层;

 

  keyWindow 

    官方文档中是这样解释的 “The key window is the one that is designated to receive keyboard and other non-touch related events. Only one window at a time may be the key window." 翻译过来就是说,keyWindow是指定的用来接收键盘以及非触摸类的消息,而且程序中每一个时刻只能有一个window是keyWindow。

 

  观察UIWindow的文档,我们可以发现里面有四个关于window变化的通知:

    UIWindowDidBecomeVisibleNotification

    UIWindowDidBecomeHiddenNotification

    UIWindowDidBecomeKeyNotification

    UIWindowDidResignKeyNotification

  这四个通知对象中的object都代表当前已显示(隐藏),已变成keyWindow(非keyWindow)的window对象,其中的userInfo则是空的。于是我们可以注册这个四个消息,再打印信息来观察keyWindow的变化以及window的显示,隐藏的变动

  变成keywindow 的流程是这样的:

    1.程序默认的window先显示出来

    2.默认的window再变成keywindow 

    3.AlertView 的window显示出来

    4.默认的window变成keywindow

    5.最终AlertView的window变成keywindow 

  总体来说就是“要想当老大(keyWindow),先从小弟(非keyWindow)开始混起” 而且根据测试我们同时可以知道默认的window的level是0,即normal级别;AlertView的window的level是1996,比Alert级别稍微低了一点儿。

  keyWindow的变化和window的显示和上面的流程一样,同时我们可以看出ActionSheet的window的level是2001;

  当我们点击ActionSheet cancel的时候,我们会看到流程

  1.首先ActionSheet 的window变成非keyWindow

  2.程序默认的window变成keywindow 

  3.ActionSheet 的window隐藏掉

 ---------------------------------------------------------------------------

@property(nonatomic,readonly) NSArray  *windows;跟keywindow

  刚开始看了觉得很奇怪,不是说一个应用只有一个窗口吗?干嘛还弄个数组,结果一测试才知道输出来以后,除了window还有UITextEffetsWindow。网上查了keywindow是指当前活跃的window,与用户交互的window。而windows是指当前app打开的所有window,比如键盘也在一个window里面,alert也在一个window里面。在windows数组里面,window是根windowLevel来排列的,最后一个覆盖在最上面。这里的windows数组不包括系统提供的window,比如说状态栏就是在一个系统创建的window里面

注意:keyWindow不是一成不变的,当你创建alertView或者ActionSheet的时候,它们所在的window会变成keyWindow。也就是说系统默认创建的window首先变成keywindow,而当弹框的时候,alertView所在的window变成keywindow,默认的keywindow变成非keywindow。

UIWindow笔记

标签:

原文地址:http://www.cnblogs.com/weizaiww/p/5466344.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!