UIWindow是最顶层的界面容器,继承自UIView ,所以它具有UIView的所有功能,但是,更多的时候UIwindow是作为UIview的顶层容器存在,每一个ios工程都有一个UIWindow,但是不是唯一,xcode会为我们自动生成UIWindow,并让她成为keywindow并且显示出来。
那下面我们来看看系统启动过程中,系统调用UIWindow:
系统创建UIWindow代码:
self.window=[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
系统设置UIWindow的颜色:
self.window.backgroundColor=[UIColor whiteColor];
设置主窗口,并显示出来:
[self.window makeKeyAndVisible];
让窗口成为主窗口,并且显示出来。有这个方法,才能把信息显示到屏幕上。
因为Window有makekeyandvisible这个方法,可以让这个Window凭空的显示出来,而其他的view没有这个方法,所以它只能依赖于Window,Window显示出来后,view才依附在Window上显示出来。
[self.window make keywindow]//让uiwindow成为主窗口,但不显示。
系统会创建一个uiwindow但是并不是唯一的uiwindow,那我们就来谈谈什么时候系统会自动创建uiwindow,并在使用结束的时候销毁:
获取UIwindow
(1)[UIApplication sharedApplication].windows 在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象(平时输入文字弹出的键盘,就处在一个新的UIWindow中)
(2)[UIApplication sharedApplication].keyWindow(获取应用程序的主窗口)用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。
提示:如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
(3)view.window获得某个UIView所在的UIWindow
- UIAlertView ,我们在使用uialertview的时候,会弹出一个对话框,显示在所有view的最前面。这是系统会自动创建一个uiwindow 并且设置UIWindowLevel 设置的更高,让UIAlertView盖在所有的应用界面之上。点击确定的时候uiwindow会自动消失。
keyWindow是指定的用来接收键盘以及非触摸类的消息,而且程序中每一个时刻只能有一个window是keyWindow。
那么这里就需要考虑一个问题uiwindow是怎么成为keywindow的呢,顺序是怎样的?
1、程序默认的window先显示出来
2、默认的window再变成keyWindow
3、AlertView的window显示出来
4、默认的window变成非keyWindow
5、最终AlertView的window变成keyWindow
那么当点击取消alertview的时候keywindow又是怎么变化的呢?
1、首先UIAlertView的window变成非keyWindow
2、程序默认的window变成keyWindow
3、UIAlertView的window在隐藏掉
总体就是“想隐居幕后可以,但得先交出权利”。
在这里要特别说明一下,UIWindowLevel 该属性定义了uiwindow的层级,层级越高,就显示在最前面,依次顺序是:
UIWindowLevelNormal
UIWindowLevelStatusBar
UIWindowLevelAlert
层级一次递增.