iOS强制改变物理设备方向的进阶方法
2017-05-31 15:25
155 查看
iOS强制改变物理设备方向的进阶方法
0x00 引入
苹果没有公开强制设置物理设备方向的方法。SO上能找到的最多的方法是:
NSNumber orientation = [NSNumber numberWithInt:targetOrientation];
[[UIDevice currentDevice] setValue:orientation forKey:@"orientation"]
这种方法使用KVO机制,间接地使用了苹果的私有方法。不过多次实测验证不影响上架审核。
0x01 问题
上述setValue:forKey:方法有一个问题,如果将要设置的目标方向与当前物理设备的方向一样的话,上述方法可能会不起作用。例如:两个视图控制器A和B,其中A支持横屏和竖屏, B仅支持横屏,当从Portrait方向由 A push到 B时,强制设置B的方向为LandscapeRight,从B返回到A时,我们还希望A是Portrait方向。但是如果我们在B视图控制器上把设备旋转至Portrait方向时,然后在返回A,使用上述setValue:forKey:的方法强制把物理设备方向设置为Portrait时就会不起作用,因为此时物理设备的方向与将要设置的目标方向是一样的。
0x02 原因猜想
如果当前物理设备的方向与要设置的目标方向一致时,系统可能觉得没有必要进行任何操作(按照正常的逻辑来考虑,好像应该是这样),在系统内部实现上可能就直接return了(未考证,猜测)。然而业务的需求常常会不仅仅于此,我们期望能在任意当前方向把物理设备设置为任意目标方向。0x03 问题解决
既然直接通过setValue:forKey:设置目标方向不起作用,那么猜想可以先设置一个unknown方向欺骗系统,然后再设置目标方向,这时目标方向跟unknown方向是不同,系统就会生效这种设置。下面是一个强制设置设备方向的方法:
- (void)forceToOrientation:(UIDeviceOrientation)orientation { NSNumber *orientationUnknown = [NSNumber numberWithInt:0]; [[UIDevice currentDevice] setValue:orientationUnknown forKey:@"orientation"]; NSNumber *orientationTarget = [NSNumber numberWithInt:orientation]; [[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"]; }
在iOS7,8,9上验证,可以完美解决0x01例子中的问题。
在苹果不提供有效的公开API时,这种方法基本可以达到这样的目标:在任意当前方向把物理设备设置为任意目标方向。
相关文章推荐
- iOS强制改变物理设备方向的进阶方法
- iOS android 下强制改变屏幕方向
- IOS 4,5和6上对设备方向支持方法的变更
- ios设备中angularjs无法改变页面title的解决方法
- ios 强制改变某一页面屏幕方向
- ios 程序窗口适应设备方向改变
- iOS监听设备方向的方法
- UIDevice的orientation方法,获取ios设备方向不准确问题
- 【iOS奇葩特性】layoutSubviews在iPhone和iPad中,当设备方向改变后的调用情况
- 在AIR编写的Android/iOS程序中控制设备方向
- ios开发之确定设备当前的方向
- 保持iOS设备屏幕常亮的方法
- IPad iOS开发基础——ipad设备方向识别
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- ios 进阶 -- 调用webservice接口(soap协议)的方法
- 关于iOS app的设备方向支持的问题
- 把IOS测试程序部署给其它设备的方法
- 获取普通用户 iOS 设备上的 Crash Log 的方法 .
- iphone学习笔记--模拟器改变方向时调用的有几个方法
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法