一周随笔--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,虽然这些控件表面上是UIWindow,但其内部是一个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总结

见 博文链接


四.系统本地推送

博文链接

时间: 2024-10-18 09:34:07

一周随笔--15.10.06的相关文章

一周随笔--15.10.27

一周新知识点记录(15.10.27) 一.不规则按钮OBShapedButton 常规按钮都是一个矩形区域,即使设置了按钮layer的cornerRadious,能响应点击事件的依旧是整个矩形区域. OBShapedButton是开源的第三方库,直接继承自UIButton,直接使用即可.它的响应区域只限定在button的图片或者背景图片区域,周围空出的区域无法响应. 二.sendActionsForControlEvents UIButton的实例方法,通过代码手动发送按钮的点击事件触发按钮的响

一周随笔--15.10.19

一周新知识点记录(15.10.19) 一.ipad——UIPopoverController UIPopoverController继承自NSObject,因此不具备显示能力,它是通过其中的内容控制器显示的内容的.  UIPopoverController使用四部曲: 一.创建UIPopoverController的内容控制器 二.根据内容控制器初始化UIPopoverController对象 三.设置UIPopoverController对象的尺寸 四.显示UIPopoverControlle

一周随笔--15.11.02

一周新知识点记录(15.11.02) 一.storyboard中搭建tableViewCell 在storyboard中搭建tableView,一种是以UITableViewController为容器,另一种则是以UIViewController为容器,拖出一个tableView来. 当以UITableViewController为容器时,UITableViewCell可以是动态也可以是静态的,若是静态的则控制器可以不关联文件.(具体待验证)http://m.blog.csdn.net/blog

一周随笔--15.9.21

一周新知识点记录(15.9.21) 一. writeToFile:atomically: - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile; 第二个参数的意思是: 如果为YES则保证文件的写入原子性,就是说会先创建一个临时文件,直到文件内容写入成功再导入到目标文件里. 如果为NO,则直接写入目标文件里. 二.  NSerror 参数依次为: 1.错误域(NSString) 2.错误标识 (NSIntege

一周随笔--15.9.28

一.阴影(NSShadow)参考 self.view.layer.shadowColor = [UIColor blackColor].CGColor; //阴影颜色 self.view.layer.shadowOffset = CGSizeMake(10, 10); //阴影偏移 四周阴影则设置为CGSizeZero self.view.layer.shadowOpacity = 1; //阴影透明度,默认为0,不显示 self.view.layer.shadowRadius = 10; //

开关智能管理工具NI Switch Executive 15.10

NI Switch Executive 15.10是一款智能的开关管理与路由程序.在用于自动测试设备(ATE)系统的开关软件中 ,它提供了最新的革命.使用NI Switch Executive 15.10,你将可以通过交互式配置和命名开关模型.外部连接 和信号路由等途径来提高开发效率.你也可以使用NI TestStand, LabVIEW, LabWindows/CVI, 和 Measurement Studio进行开关编程来提高测试代码重用和系统性能.最终NI Switch Executive

Ubuntu 15.10

安装Ubuntu 15.10后要做的事 http://blog.csdn.net/skykingf/article/details/45267517 ubuntu15.10 install-mac-theme http://www.linuxdiyf.com/linux/15583.html 每周一贴:Ubuntu Kylin 15.10 如何安装Mac主题 http://www.ubuntukylin.com/news/shownews.php?lang=cn&id=547 Opencv3.1

Ubuntu 15.10搭建IPSec L2TP服务器

以下步骤完全使用于Ubuntu 14.04版本 首先安装以下所需包 sudo apt-get install openswan xl2tpd ppp lsof!注意!Ubuntu 15.10会提示无法找到openswan包,解决办法是用喜欢的编辑器编辑以下文件,实例用vimsudo vim /etc/apt/sources.list在文件最后添加一行deb http://us.archive.ubuntu.com/ubuntu precise main universe保存后,执行下面命令sud

安装Ubuntu 15.10后要做的事

Ubuntu 15.10发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java写出来的office执行效率实在不敢恭维,装完系统后果断删掉 [html] view plain copy sudo apt-get remove libreoffice-common 2.删除Amazon的链接 [html] view plain copy sudo apt-get remove