《iOS进阶》-UIWindow

UIWindow

UIWindow是最顶层的界面容器,继承自UIView。作用如下:

为UIWindow增加UIView

系统对UIWindow的使用

通常在一个程序中只会有一个UIWindow,但是有时候调用系统控件时(如UIAlertView),iOS系统为了保证控件在所有的界面之上,他会临时创建一个新的UIWindow,通过将其UIWindow的UIWindowLevel设置得更高,让控件盖在所有的应用界面之上。

UIWindow的UIWindowLevel属性定义了UIWindow的层级。一共有三种取值,默认为0:

typedef CGFloat UIWindowLevel;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;

手动创建UIWindow

当我们想将某些界面覆盖在所有界面的最上层时,我们可以手动创建一个UIWindow.UIWindow一旦被创建,他就自动被添加到整个界面之上了。对于复杂的界面可以继承UIWindow,在子类中写相关逻辑,可以用单例模式创建等等,根据不同情况来设置。

如果我们创建的UIWindow需要处理键盘事件,那就需要合理的将其设置为KeyWindow。keyWindow是被系统设计用来接收键盘和其他非触摸事件的UIWindow.我们可以通过makeKeyWindowresignKeyWindow方法来将自己创建的UIWindow实例设置成keyWindow.

适合用UIWindow来实现的功能有:密码输入界面、应用启动介绍页、应用内的通知提醒显示和应用内的弹框广告等。

不要滥用UIWindow

如果弹出界面明显属于某个ViewController,那么更适合把弹出的界面当做这个ViewController的view的subView实现。

常见的滥用方式是把需要弹出的界面都设置成单例,需要的时候就调用显示,这种做法会使新创建的UIWindow一直得不到释放。当出现多个UIWindow需要相互有层级覆盖关系时,实现起来会比较复杂。