1.UIWindow & UIWindowLevel
一、简单介绍UIWindow是什么?
UIWindow是一种特殊的UIView,UIWindow继承自UIView,也就是说它本身就是一个视图的容器。通常一个App一般有一个UIWindow,也就是AppDelegate中的UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。
UIWindow在程序中主要起到三个作用:
1、作为容器,包含app所要显示的所有视图
2、传递触摸消息到程序中view和其他对象
3、与UIViewController协同工作,方便完成设备方向旋转的支持
二、通常我们可以采取两种方法将view添加到UIWindow中:
1、addSubview
直接将view通过addSubview方式添加到window中,程序负责维护view的生命周期以及刷新,
但是并不会为去理会view对应的ViewController,因此采用这种方法将view添加到window以后,
我们还要保持view对应的ViewController的有效性,不能过早释放。
2、rootViewController
rootViewController是UIWindow的一个遍历方法,通过设置该属性为要添加view对应的ViewController,
UIWindow将会自动将其view添加到当前window中,同时负责ViewController和view的生命周期的维护,防止其过早释放
三、WindowLevel
UIWindow在显示的时候会根据UIWindowLevel进行排序的,即Level高的将排在所有Level比他低的层级的前面。下面我们来看UIWindowLevel的定义:
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系统中定义了三个window层级,其中每一个层级又可以分好多子层级(从UIWindow的头文件中可以看到成员变量CGFloat _windowSublevel;),不过系统并没有把则个属性开出来。UIWindow的默认级别是UIWindowLevelNormal,我们打印输出这三个level的值分别如下:
UIViewSample[395:f803] Normal window level: 0.000000
UIViewSample[395:f803] Alert window level: 2000.000000
UIViewSample[395:f803] Status window level: 1000.000000
window在创建的时候,默认是UIWindowLevelNormal(0.0),这个值越大,层次越靠上,也就是说
windowLevel大于0,小于1000的时候,在statusbar之下,在默认的window之上
windowLevel大于1000的时候,就在statusbar之上了。
2. keyWindow
keyWindow是获取键盘和其他非触摸事件的window,同一时间只能有一个window为keywindow。所以,如果自己创建的Window要相应除触摸外的事件,要设置为keyWindow.
makeKeyWindow //设置当前window为main window.
keyWindow的”生命周期”
这两个方法类似于viewWillAppear等,自动触发,不要手动调用。
- becomeKeyWindow
- resignKeyWindow
所以,以后需要呈现在顶部的视图,要添加到UIApplication.sharedApplication()
.keyWindow 上。
keyWindow 确保了你一定能拿到当前活跃的window,文档中是这样描述 keyWindow 的:
原则上是只有一个window与用户交互,但不代表就只存在一个window。Alert也是一个window
keyWindow就是指活跃的window。
iphone键盘也在一个window里,叫UITextEffectsWindow;
window可以层叠的,各个window都可以被响应。