最近的项目里有个关于创建多个uiwindow时使用keywindow出现的bug。

最近的项目里有个关于创建多个uiwindow时使用keywindow出现的bug。

有个任务是在打开信息展示时,要求不被任何东西遮挡。这里设计方案是添加一个新的HXUIWindow继承与UIWindow。测试时打开了HXUIWindow显示在屏幕上,执行打开 弹框 按钮(uiactionsheet或uialerview),当弹框消失后,再执行向主页最外层添加一个view,这个时候应该会想到用[[UIApplication sharedApplication].keyWindow addSubview:view],这个时候问题出现了,程序将view添加到了HXUIWindow上,而HXUIwindow大小只有100*100,所以超出的内容没有点击事件。

这是为什么呢?因为这个时候[UIApplication sharedApplication].keyWindow 是HXUIWindow而不是程序最开始默认的那个[[[UIApplication sharedApplication] delegate] window]。这又是为什么呢,因为这里执行了打开 弹框 按钮(uiactionsheet或uialerview),当打开(uiactionsheet或uialerview)时,程序为了让弹框出现在最外层,会新建一个临时的uiwindow,并且层级最高,还将keywindow赋值与它。当弹框消失后keywindow将转向另一个uiwindow,这个时候转向了HXUIWindow,因为HXUIWindow层级最高,在windows里层级拍最后面。刚开始的时候只有[[[UIApplication sharedApplication] delegate] window],所以其为keywindow,当然也是有因为设置为keywindow的原因,只有添加HXUIWindow时没有改变keywindow的值,当弹窗弹出后keywindow会将指向弹框弹出后新建的uiwindow,弹窗消失时keywindow又将重新指向,这个时候其会将指向层级最高的uiwindow,所以指向了HXUIWindow了。


总结:

1.经过测试keyWindow永远是覆盖在视图的最外层,在正常情况下获取到的keyWindow是UIWindow;

 2.在有UIAlertView或UIActionSheet的弹出层情况下,在去获取keyWindow这个时keyWindow就会变成UIAlertControllerShimPresenterWindow这个类,是弹出层上层的一个window;

3.在UIAlertView或UIActionSheet弹出后再给keyWindow添加的view,会在UIAlertView弹出层消失后,keyWindow上边的视图也会随之消失;

4.会在UIAlertView弹出层消失后,keyWindow指向视图最外层的HXUIWindow了,之后添加到[[UIApplication sharedApplication].keyWindow 上的uiview都将添加到HXUIWindow上了;

猜你喜欢

转载自blog.csdn.net/u012891546/article/details/78615833
今日推荐