浅谈编者对UIWindow的认识与理解
Window在手机屏幕上界面上提供了一个区域来显示APP的界面视图View,也将APP中的事件分发给View。一个应用程序通常情况下只有一个Window。
可以通过UIApplication获取当前的keyWindow,keyWindow是用来管理键盘以及非触摸类的消息,并且只能有一个window是keyWindow。
UIWindow有三个级别,对应三种显示优先级。通过windowLevel设置:
UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal
一个iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了,就是说没有UIWindow,就看不到任何UI界面。
UIWindow对象的责任:1:包含了应用程序的可视化内容。2:为视图和其它应用程序对象在触摸事件中提供了关键的作用。3:它与视图控制器一起协作来呈现数据。
解释下UIWindow与UIView的关系,UIWindow是UIView的子类,都间接继承于NSObject,UIWindow对象又是UIView的根视图,管理和协调应用程序的显示,分发事件给View。另外NSObject子类详细关系图如下:
UIWindow的简单使用
1:代码创建(在AppDelegate.m中创建的情况)
//创建一个window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//添加背景颜色
self.window.backgroundColor = [UIColor whiteColor];
//创建一个视图控制器作为window的根视图控制器
self.window.rootViewController = [[UIViewController alloc] init];
//让window成为主window并且显示window,此方法能实现信息显示在屏幕上
[self.window makeKeyAndVisible];
在此提供一张关系图
应用程序启动之后,先创建Application,再创建它的代理,之后创建UIWindow,UIWindow继承自UIView。
2:在storyboard中UIWindow也是被创建的,同时创建了相应的控制器,只不过创建过程被屏蔽了,其过程是当用户点击程序图标的时候,先执行main函数,执行UIApplicationMain(),根据参数创建Application,创建代理,并把代理设置给application(info.plist里面的storyboard的name,根据这个name找到对应的storyboard),开启一个事件循环,当程序加载完毕,会调用代理的didFinishLaunchingWithOptions:方法,在调用此方法之前回家再storyboard,加载时创建一个Window,接下来创建箭头所指向的控制器,把该控制器设置为UIWindow的根控制器,最后将window显示出来。
本文只是编者自己对UIWindow的认识与理解,如有误请指正。