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开发进阶...
作者唐巧,本书定位于帮助那些iOS开发人员提高自己的开发水平
高清 带目录 iOS开发范例实战宝典(进阶篇)
"iOS开发范例实战宝典(进阶篇)"聚焦于实际应用中的各种技术,旨在帮助开发者掌握更高级的iOS开发技巧。这本书深入探讨了图形图像处理、数据可视化、网络交互、媒体播放、地理位置服务以及设备传感器的应用。以下是...
iOS开发进阶完整版 作者唐巧 iOS开发人员的好助手,希望有帮助
iOS开发范例实战宝典 进阶篇PDF 第2部分
在iOS开发领域,掌握进阶技术是提升个人技能的关键步骤,这将使你从众多开发者中脱颖而出。"iOS开发进阶篇-成为一个iOS开发高手"这份资料正为此目标提供了全面的指导。它深入探讨了iOS开发的核心概念和技术,旨在...
iOS开发进阶
《iOS开发进阶》分工具、实践、理论三大部分。第一部分介绍iOS 开发的常用工具,第二部分介绍iOS开发中的一些常见的实践经验,第三部分介绍iOS 开发中涉及的原理。 如果把成为iOS 开发高手的过程比作武侠小说中的...
iOS 11数据库开发进阶教程涵盖了Swift 4语言下多种数据库框架和组件的使用方法。本教程针对的是希望进一步提升其iOS数据库开发技能的开发者。接下来,我将详细阐述书中提到的一些核心知识点。 1. SQLite数据库概述 ...
《iOS开发进阶完整版 唐巧》是一份针对已具备基础iOS开发技能的开发者设计的高级教程,由知名iOS开发专家唐巧编写。这份资料深入探讨了iOS开发的各个方面,旨在帮助开发者提升技能,进一步提升其在iOS平台上的应用...
【iOS进阶指南大全,各类书籍PDF中文版】 在iOS开发的世界中,进阶学习是提升技能的关键。这个资源集合包含了一系列由大神翻译的苹果官方文档,旨在帮助开发者深入理解并熟练掌握iOS开发的核心技术。以下是每个主题...
总的来说,"IOS强制横竖屏代码"这个项目旨在帮助开发者灵活地控制iOS应用的屏幕方向,无论是在单个界面还是跨界面场景下。通过理解并应用上述概念和技术,开发者可以创建出更符合用户需求的、能够自由旋转的iOS应用...
iOS开发进阶,著名大神唐巧著,介绍iOS开发的一些常用工具和开发实践
文件太大,上传不了。 github:https://github.com/bestDew/ZKTreeTableView.git 掘金:https://juejin.im/post/5ba67ad7e51d450e8477b603