码迷,mamicode.com
首页 > 移动开发 > 详细

iOS中的UIWindow

时间:2016-08-05 15:59:56      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/chaoguo1234/p/5741208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!