那些年 iOS 升级踩过的坑!( 二 )

最早的实现

众所周知,苹果一个比较坑的地方就是开放的SDK是比较有限的,特别是当时的iOS SDK 4.3。很多功能通过开放的API很不好实现,上述的功能就是一个例子。当然,这难不倒我策天才般的iOS开发同学。一会就试出来实际上UIViewController上有一个私有方法(private method)就叫[UIViewController rotate],提供的功能刚好就是我们需要的。但遗憾的是由于苹果审核机制,它是不允许上架app中使用iOS SDK的私有方法的。(至今我还是不明白为什么这个方法不给开放出来给大家用。)经过进一步的研究,我们尝试出来的一个解决方法是这样的:

那些年 iOS 升级踩过的坑!

图2/6

就是在当前的UIViewController上present一个新的UIViewController,然后马上再dismiss掉。看起来好像啥事都没做。实际上这几行代码的唯一作用是让系统(UIKit)重新评估(re-evaluate)当前UIViewController应该处于的方向,也就是说旋转相关的系统回调函数[UIViewController shouldAutorotate]和[UIViewController supportedInterfaceOrientations]会被再次调用。此时我们可以趁机在这两个回调函数中返回合适的值,使得当前的UIViewController的方向强制变成我们所希望的。

推荐阅读