在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
网友评论