一、UIWindow特点
(1)UIWindow 是一种特殊的 UIView,通常在一个 app 中至少会有一个 UIWindow;
(2)iOS程序启动完毕后,创建的第一个视图控件就是 UIWindow,接着创建控制器的 view,最后将控制器的 view 添加到 UIWindow 上,于是控制器的 view 就显示在屏幕上了;
(3)一个iOS程序之所以能显示到屏幕上,完全是因为它有 UIWindow,也就说,没有UIWindow,就看不见任何UI界面。
二、添加 UIView 到 UIWindow 中两种常见方式:
(1)- (void)addSubview:(UIView )view;*
直接将 view 添加到 UIWindow 中,但并不会理会 view 对应的 UIViewController;
(2)@property(nonatomic,retain) UIViewController *rootViewController;
自动将 rootViewController 的 view 添加到 UIWindow 中,负责管理 rootViewController 的生命周期。不同于前者(1)的是,比前者多一个屏幕旋转功能,只会相对转屏,而不会整体(包括状态栏)都旋转,所以推荐使用前者。
三、UIWindow 常用方法
- (void)makeKeyWindow;
让当前 UIWindow 变成 keyWindow(主窗口);
- (void)makeKeyAndVisible;
让当前 UIWindow 变成 keyWindow,并显示出来。
四、UIWindow 的获得
[UIApplication sharedApplication].windows
在本应用中打开的 UIWindow 列表,这样就可以接触应用中的任何一个 UIView 对象;
(平时输入文字弹出的键盘,就处在一个新的 UIWindow 中)
[UIApplication sharedApplication].keyWindow
用来接收键盘以及非触摸类的消息事件的 UIWindow,而且程序中每个时刻只能有一个 UIWindow 是 keyWindow。如果某个 UIWindow 内部的文本框不能输入文字,可能是因为这个 UIWindow 不是 keyWindow。
五、UIWindow 创建步骤
实例代码说明:
(1)创建窗口对象;
注意点:1.不要让窗口销毁,需要弄一个强引用;2.必须要设置窗口的尺寸。
(2)创建窗口的根控制器,并且赋值;
注意点:苹果推荐使用控制器的原因,对应界面的事情交给对应的控制器去管理。一旦设置窗口的根控制器,就会把跟控制器的 view 添加到窗口
(3)显示窗口。
[self.window makeKeyAndVisible];
makeKeyAndVisible:
1 可以显示窗口;底层实现为: self.window.hidden = NO;
2 成为应用程序的主窗口;底层实现为:application.keyWindow = self.window;
六、UIWindow 层级
self.window.windowLevel = UIWindowLevelAlert;
UIWindow 有三个层级:UIWindowLevelAlert, UIWindowLevelStatusBar, UIWindowLevelNormal, 其中,优先级为:UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal.
值得注意的是,优先级变量是可以作加减运算的,这是因为 windowLevel 是 CGFloat 类型。