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


强制横屏:

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



 


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




 


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


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





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





此处何解,求大神指导。。。

这是在stackoverflow见到的相关问题,就只搜到这一个,且没有解决方案。。。
http://stackoverflow.com/questions/26357162/how-to-force-view-controller-orientation-in-ios-8

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


实际上做到这一步,我的强制横屏的过程是这样的:

首先自定义播放器基于MPMoviePlayerControllerm 比如说定义了一个XHMMoviePlayerController
全局变量:playerWindowBgView:全屏时播放器的superView(黑色)

响应横屏时:
1、将playerWindowBgView加载到keyWindow上。设定frame=window.bounds;设定alpha=0.f;(之后旋转结束的时候显示出来alpha=1.f);
2、将XHMMoviePlayerController的播放界面addSubView到playerWindowBgView上,并重新调整界面控件的位置大小等。(所有的view.alpha设定为0.f)---月黑风高可以肆无忌惮...
3、旋转playerWindowBgView同时调整statusBar的方向。
4、所有的view.alpha=1.f;大功告成!
我这个bug出在第3步的“调整statusBar方向”上,iOS8里面用setStatusOrientation调整了StatusBar方向之后,会变成这个样子。这就是问题所在了。如果横屏时隐藏statusBar并使用[[UIDevice currentDevice] setValue: [NSNumber numberWithInteger: UIInterfaceOrientationLandscapeRight] forKey:@"orientation"];勉强满足需求,但是statusBar不能正常显示。
后来有网友推荐了这篇博文:
http://chun.tips/blog/2014/10/23/xiang-jie-uicoordinatespacehe-uiscreenzai-ios-8shang-de-zuo-biao-wen-ti/
便于理解iOS8的坐标体系相关的东东。
感觉类似我的这种强制全屏在iOS8里面,在概念上已经跟iOS7及其之前的概念完全不同了。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值