遇到这样的情况:集成公司某部门提供的SDK时,所有的接口都是闭源的, 其中有一个接口返回
UIViewController
类型的对象,根据产品需求,需要在某个地方present
该控制器,并把它强制横屏,当时曾思考如何实现,下面记录我的办法。
我们知道,必须具备两个条件才能让一个被present
出来的控制器旋转到指定的屏幕方向:
- 项目配置文件中支持的屏幕方向;
- 被
present
出来的控制器支持的屏幕方向。
两个条件所支持的屏幕方向的交集,便是目标控制器所支持旋转的方向。
(注,令一个被
push
出来的控制器,在第二个条件上有所差别。)通过重写
UIViewController
的supportedInterfaceOrientations
方法来修改目标控制器所支持的屏幕方向,此方法在iPhone上默认的返回值是UIInterfaceOrientationMaskAllButUpsideDown =
(UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), 即除了竖屏向下之外的其他三个方向;有些人的经验表明,除了上述两个条件之外,还必须重写目标控制器的
shouldAutorotate
方法,但我在iOS 11, Xcode 9