iOS8.1- iOS8.3横屏后部分区域无响应 坐标错乱

来源:互联网 发布:软件测试逻辑思维题 编辑:程序博客网 时间:2024/06/06 18:17

http://www.cocoachina.com/bbs/read.php?tid-244119-page-1.html

iOS8之后只支持竖屏的App中某个界面强制横屏后导致部分区域无响应   

强制横屏:


 iOS7中的场景:Reveal软件监控视图层次的结构


iOS7强制横屏后,UIWindow\UIScreen:mainScreen\UIView的坐标系高度重合


 


iOS8.1中该视图结构变成了:



 


参看了UIWindow相关API接口和UIApplication:sharedApplication相关的API接口,iOS8 SDK中并没有新增。


而目前通过[[UIApplication sharedApplication] setStatusOrientation:**];来强转 只会让UIWindow:keyWindow转过来,而UIScreen:mainScreen纹丝不动。(或者反过来说也可以解释上图的现象) 这样就导致了UIWindow上部分点击虽然点击实际上发生在屏幕当中但设备处理时 却判断其超出了屏幕范围的诡异情况。。。


iOS8 [[UIApplication sharedApplication] setStatusOrientation: **] rotation bug 


我通过改变UIWindow的frame来对齐UIScreen:mainScreen的Frame,结果是UIWindow上的元素排列非常的混乱。而通过SDK的API接口来强制旋转UIWindow也没有找到。改变UIScreen:mainScreen的Frame似乎也是不可取,因为[[UIApplication sharedApplication] setStatusOrientation:**];这个API接口就是要使得UIScreen:mainScreen呈现现在这个样子的。


keywindow在强制横屏的时候,旋转M_PI_2,从Reveal的视图结构可以看到 UIWindow/UIScreen:mainScreen/UITextEffectsWindow 三者合一了,但是三者跟设备的屏幕硬件 形成了一个90度角.

用了[[UIDevice currentDevice] setValue: [NSNumber numberWithInteger: UIInterfaceOrientationLandscapeRight] forKey:@"orientation"];之后 问题来了。状态栏没有横过来,卧槽,如果叠加使用[[UIApplication sharedApplication] setStatusOrientation: **];问题又回到原点去了。只好将状态栏在全屏的时候隐藏,要不然自己造一个状态条放上去,顿时蛋很疼啊。iOS8 这里是不是SDK一个显而易见的bug还是怎么滴,感觉不合理啊 UIScreen:mainScreen 和UIWindow:keyWindow通过API接口调用来转屏居然会分道扬镳,这绝对不合理吧 Apple大神!

强制旋转的时候 弃用[[UIApplication sharedApplication] setStatusOrientation: **];使用 [[UIDevice currentDevice] setValue: [NSNumber numberWithInteger: UIInterfaceOrientationLandscapeRight] forKey:@"orientation"]; 就可以三位一体 来旋转啦.但是此方法会导致顶部状态条没有切换,不完美,后期完美的解决方案请看后面的专题文章。