> 在iOS应用中,我们使用UIWindow和UIView来呈现界面。UIWindow并不包含任何默认的内容,但是当他被当作UIView的容器,用于放置引用中所有的UIView。而每一个UIView通常都是用来表示具体的一部分界面,例如一段文字,一张图片等,当然,你也可以用UIView来当作其他容器UIView的容器。所以UIWindow更多的时候只作为UIView的顶级容器存在. ———以上摘抄自《iOS开发进阶》 本章节较好的介绍了UIWindow的使用,算是唐巧大神的经验之谈。 ------- # 12.1UIWindow简介 从继承关系上来看UIWindow继承自UIView,所以UIWindow包含所有UIView的功能,除此之外,还增加了一些特有的属性和方法。 我们一定使用过UIWindow,最常见的用法就是在appdelegate中的didFinishLaunchingWithOptions方法中: ``` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. _window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; tabbarViewController *tabbar = [[tabbarViewController alloc]init]; _window.rootViewController = tabbar; [_window makeKeyAndVisible]; return YES; } ``` UIWindwo的主要作用: - 作为UIView的 顶级容器,包含应用显示所需的所有UIView。 - 传递触摸消息和键盘事件给UIView。 # 12.2 为UIWindow增加UIView - UIWindwo是UIView的子类,所以你可以使用addsubview方法来为UIWindow添加UIView - 像我们上面在appdelegate中的didFinishLaunchingWithOptions方法中使用的一样,我们可以通过设置UIWindow的rootViewController 来添加UIView,系统会自动将controller上的view添加到UIWindow上。 # 12.3系统对UIWindow的使用 在一个app中存在的UIWindow往往并不止一个,例如当使用UIAlertView(现已过期)时系统就是创建了一个UIWindow,并将UIWindowLevel设置的更高来保证UIWindow显示在最上层。 ``` [UIApplication sharedApplication].windows; //系统中所有的UIWindow的数组,排列为层次从低到高 [UIApplication sharedApplication].keyWindow; //当前活动的UIWindow ``` # 12.3.1WindowLevel 上文提到了UIWindow的层次问题,而这个属性是通过WindowLevel来描述的。这是一个CGFloat类型,在iOS中系统有三个常量: ``` UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; //0 默认值 UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; // 2000 UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar __TVOS_PROHIBITED; // 1000 ``` 当然事实上并不止这么几个值,你可以复制成你想要的值。 # 12.3.2手动创建UIWindow 书中有大片的示例代码(为什么给我滥竽充数的感觉),总结一下就是以下几个点: 1、什么时候使用UIWindow? 由于UIWindow的特性—显示在顶层,所以一般来说我们将会利用这个特性。比如说:密码输入界面(支付宝手势解锁)、应用介绍、弹出的banner、弹出的广告之类的。 2、如何显示UIWindow? 一般来说我们调用makeKeyAndVisible 这个方法来使UIWindow显示在应用顶层。 事实上我们只需要将self.hidden=NO;就可以显示出UIWindow了,两个方法的区别就是上面那个方法同时设置了keyWindow 3、如何移除UIWindow? ``` _window.hidden = YES; _window = nil; ``` # 12.3.3不要滥用UIWindow 有的时候我们明显可以判断这个View属于某个controller的时候那么更适合将调用vc的addsubview方法来来实现显示。 同事当UIWindow过多使用的时候,有时候我们很难管理每个Window的层次关系,从而导致希望显示到顶层UIWindow未能显示在顶层。 ------ [更多文章](http://sbookreview.com/?section=blog-front) 欢迎加入iOS交流群537774852