一周随笔--15.10.06

一周新知识点记录(15.10.06)

一.UIWindow的windowLevel (优先级)

  我们在程序中获取通过[UIApplication sharedApplication].keyWindow获取到应用程序的主屏幕,其实并不一定是AppDelegate类中定义的那个window。首先了解UIWindow的一些概念: 

  UIWindow是一种特殊的UIView,它也可以自定义,在程序中可以同时显示多个UIWindow对象(UIWindow对象通过makeKeyAndVisible方法显示出来。makeKeyAndVisible方法,从方法名字面上看有两层意思:让window成为key window,使得window可见。)。这就不得不说到UIWindow的一个属性windowLevel,这个属性用来表示window对象的优先级。系统提供3个值(UIWindowLevel类型,CGFloat的别称):

 UIWindowLevelNormal;    

UIWindowLevelAlert;    

UIWindowLevelStatusBar;   

打印出来一次为0.000000   2000.000000  1000.000000

值越大,window的优先级越高,当然也可以自己设这3个值以外的值,UIWindowLevelNormal为默认值,即对一个UIWindow对象的windowLevel不设为另外两个值,其优先级默认为UIWindowLevelNormal

  怎么理解这个优先级?如果要显示两个UIWindow对象在屏幕上,假如两个对象的优先级一样,即windowLevel值一样,或者不设置,默认都为UIWindowLevelNormal,那么最终显示结果是先显示的那个window在后,后显示的window在前。而对于两个优先级不一样的UIWindow对象,优先级高的在前,低的在后。

  回到一开始说的keyWindow,既然一个程序可能存在多个UIWindow对象,那么keyWindow到底是哪个呢?答案是,谁最后显示谁就是keyWindow!注意不是谁在最前面,而是谁最后显示,对于自己定义的UIWindow对象,最后显示指的是谁最后调用makeKeyAndVisible方法。

  事实上,除了自己定义的UIWindow对象,系统有一些控件其实也在UIWindow的优先级范畴内,比如UIAlertView,UIActionSheet,虽然这些控件表面上是UIView,但其内部是一个window,这一点通过UIActionSheet显示时打印[UIApplication sharedApplication].keyWindow得到验证,打印的keyWindow所属的类为UIAlertControllerShimPresenterWindow,其windowLevel值为UIWindowLevelAlert,即2000.000000 

  另外,对于状态栏,事实上也是以UIWindow的形式存在,其windoeLevel值为UIWindowLevelStatusBar,即1000.000000。因此根据UIWindow的优先级关系,自定义一个windowLevel大于1000的UIWindow对象可以覆盖掉状态栏。


 二.UIWindow层级结构

UIWindow的rootViewController分别为普通视图控制器、导航栏控制器、分页栏控制器、模态窗口情况下:

1、普通视图控制器

—UIWindow

——UIView(视图控制器的根view)

2、导航控制器

—UIWindow

——UILayoutContainerView

———UINavigationTransitionView

————UIViewControllerWrapperView

—————UIView(导航控制器的根view)

———UINavigationBar

————。。。。

3、分页栏控制器

—UIWindow

——UILayoutContainerView

———UITransitionView

————UIViewControllerWrapperView

—————UIView(分页栏控制器的根view)

———UITabBar

————。。。。 

4、模态窗口

—UIWindow

——UITransitionView

———UIView(视图控制器的根view)


三.KVC/KVO总结

见 博文链接


四.系统本地推送

博文链接

posted @ 2015-10-06 15:17  Lotheve  阅读(449)  评论(0编辑  收藏  举报