iOS开发进阶 第十二章 UIWindow

在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未能显示在顶层。


更多文章

欢迎加入iOS交流群537774852

你可能感兴趣的:(iOS开发进阶 第十二章 UIWindow)