iOS中的UIWindow
UIWindow的作用
UIWindow主要有两个作用:
1 作为UIView视图的最顶层容器,包含所有要显示的UIView
2 传递触摸,非触摸,键盘事件,其中传递非触摸和键盘事件时,UIWindow必须是keyWindow(经过实验,传递触摸事件时不需要UIWindow是keyWindow,但是必须可见)
创建UIWindow
创建UIView的时候,需要使用addSubview将新创建的View添加到视图层次当中,而创建UIWindow的时候不用这样做,因为UIWindow就是视图的最顶层容器,只要直接设置其hidden = NO,或者调用makeKeyAndVisible就可以显示了。新创建的window都会被加入到UIApplication的windows属性中,windows是一个数组,整个数组整体上按照windowLevel由低到高排序,即第0个window的windowLevel肯定最低,最后一个window的windowLevel最高,如果有两个window的windowLevel相同,那么它们的顺序是不确定的(此时,不一定就是按照创建的先后顺序排)
UIWindow的rootViewController属性
1 在为UIWindow添加子视图的时候,除了使用addSubview添加,还可以设置window的rootViewController属性。设置rootViewController之后,rootViewController上的view自动被加入到window当中,并且如果设置rootViewController时window原来就有子视图,那么这些子视图会先被移除掉。
2 如果你在(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法返回之前创建了一个window,那么就必须为其设置rootViewController属性,否则会报"Application windows are expected to have a root view controller at the end of application launch"的错误。
特别的,如果你在(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中创建了一个window1并且设置了rootViewController1,然后在这个rootViewController1的viewDidLoad中又创建了一个window2,但是没有为其设置rootViewController属性,程序运行的时候就会报上述错误,原因就是调用rootViewController1的viewDidLoad的时候,(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法还没有返回。
实际上,不管是把创建window2的代码加到rootViewController1的loadView还是viewWillAppear中都会出现这个问题,因为(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions在viewWillAppear调用之后才会继续运行。解决上面问题方法就是可以把创建window2的代码放在viewDidAppear中,此时- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法已经运行结束了。
UIWindow的windowLevel
windowLevel越大,在视觉上window就越靠前,低windowLevel的window不会遮挡高windowLevel的window。如果两个window的windowLevel一样,那么它们的顺序不确定(并不一定按照创建的先后顺序),如果想要把同一级的某个window放到和它同级window的最前面,调用makeKeyAndVisible即可(调用makeKeyWindow不会起到这个效果)
iOS中的UIWindow的更多相关文章
- iOS 中的UIWindow
使用Xcode新建一个工程后,Xcode会自动新建一些文件,其中有AppDelegate.h,AppDelegate.m,ViewController.h,ViewController.m,Main. ...
- iOS中事件传递过程
iOS中,UIApplication管理着一个事件的队列,当系统获取用户的点击或滑动等事件后,就会将这些事件按顺序插入UIApplication管理的这个队里中,UIApplication再从这个队列 ...
- iOS中响应者链条-触摸事件
总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...
- iOS中的事件传递和响应者链条
本文转自:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看ios中事件的产生和传递过程 1.发生触摸事件后,系统会将事件加入到一个由UI ...
- iOS中的触摸事件和手势处理
iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...
- ios中的事件处理、响应者链条以及第一响应者
在ios中,事件UIEvent类来表示,当一个事件发生时,系统会搜集的相关事件信息,创建一个UIEvent对象,最后将该事件转发给应用程序对象(UIApplication).日常生活中,主要有三种类型 ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- 说说iOS中的手势及触摸
一.响应链 在IOS开发中会遇到各种操作事件,通过程序可以对这些事件做出响应. 首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResp ...
- iOS中多控制器的使用
通常情况下,一个app由多个控制器组成,当app中有多个控制器的时候,我们就需要对这些控制器进行管理. 在开发过程中,当有多个View时,可以用一个大的view去管理多个小的view,控制器也是如此, ...
随机推荐
- Nginx源码研究一:NGINX模块启动
Nginx 是一个轻量级,但是高性能的 HTTP 和 代理 服务器,也是一个 IMAP/POP3/SMTP代理服务器. 它的第一个版本0.1.0是由俄罗斯的工程师Igor Sysoev与2004年10 ...
- Linux系统下快速删除某个目录下大量文件
不管是哪个操作系统,同一级目录存在太多的文件都是一件可怕的事情,不管是读取还是删除的时候. 一旦这种不幸的事情发生在你身上,而又不能完全把整个目录删掉怎么办呢? 你可以用 rm -f *.log 但是 ...
- gtk程序如何进行编译
程序名: gtk_example.c 生成目标文件:gtk_example gcc gtk_example.c -o gtk_example `pkg-config --libs --cfl ...
- 统计建模与R软件习题二答案
# 习题2 # 2.1 x=c(1,2,3) y=c(4,5,6) e=c(rep(1,3)) z=2*x+y+e;z x%*%y # 若x,y如答案那样定义为矩阵,则不能用%*%,因为,维数不对应, ...
- DDMS中File Explorer无法查看data/data文件解决办法
http://www.cnblogs.com/smyhvae/p/3881477.html 找了个连接 问题描述:最近在学习Android SQLite中的SQLiteOpenHelper,使用SQ ...
- noi 04:网线主管
04:网线主管 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 仙境的居民们决定举办一场程序设计区域赛.裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正 ...
- Java比较两个日期的大小
public static String getComparedSBQDate(String yxqq,String starttime){ String str = starttime; Simpl ...
- 安卓各文件存储路径汇总(Android file path)
写下来,省得以后不记得到处翻: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /ca ...
- UNIQUE NullAble
一般情况 UNIQUE 不应该出现nullable的 但是如果我们要支持也是有办法的,就是写一个filter. https://msdn.microsoft.com/en-us/library/ms1 ...
- hdu 1543 Paint the Wall
http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...