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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 4,446评论 0 1
  • 现在的生活就像一团迷雾,不知何去何从。 痛恨自己不能果断,不能斩断一切重新开始。 活着,太多的约束终究不适合自己。...
    墨绿梦阅读 1,787评论 0 0
  • 说实话,我并不算真正意义上去过深圳,只记得那次去香港要在深圳转机渡过深圳湾口岸。在梦里倒是无数次去过深圳了...
    丹妮小主阅读 1,706评论 0 0
  • 近日,武术界有一事闹的挺欢腾,练习现代搏击术的徐某挑战太极雷雷,掀起一阵“腥风血雨”,不觉间,让我等吃瓜群众恍若置...
    寧國截拳道舒擁軍阅读 3,199评论 0 0
  • 今晚马嘉琪在家做作业看着不开心,不爱做,心态不是很好,做数学卷子闹情绪,我的火蹭蹭的,真想揍她一顿,但还是压了下来...
    琪睿妈妈阅读 1,499评论 0 0

友情链接更多精彩内容