一般我们的项目都是只支持竖屏的,但最近做的项目是直播的,因此我播放的时候我需要旋转屏幕切换横竖屏,所以在项目设置中需要打开横屏
那么问题来了,项目中有很多个控制器,但我只要这个播放控制器可以横竖屏,其他控制器不需要,此时有两个解决办法:
继承实现:如果项目是新项目,可以新建一个基类controller,重写shouldAutorotate方法,并返回NO,项目中的所有控制器都直接或者间接继承它,需要横竖屏的控制器重写它,并返回YES就可以了
分类实现:如果项目已经持续一段时间,而且控制器累积很多了,此时用继承的方法就不太实际了,因此可以使用分类,新建一个UIViewController 的分类,重写shouldAutorotate方法,并返回NO,然后只需要在需要横竖屏的控制器中重写它并返回YES就行,相对继承实现,分类方便很多,因为其特性,只要拖入项目,就算不导入头文件,都会先执行分类的方法
然后在支持横屏的控制器实现UIDeviceOrientationDidChangeNotification监听,参考我之前写的一篇简书指定控制器横屏,强制旋转屏幕就两句关键代码
此时应该有小伙伴说shouldAutorotate方法不调用,通过实测,下面我简单总结一下出现的情况:stackoverflow上有解释
// 跟控制器是导航控制器,那么在这个导航控制器中实现下面三个方法
-(BOOL)shouldAutorotate {
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations {
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
// 跟控制器是tabBar控制器,那么在这个tabBar控制器中实现下面三个方法
-(BOOL)shouldAutorotate {
return [self.selectedViewController shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations {
return [self.selectedViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}
- 如果不在跟控制器(UITabBarController 和 UINavigationController 都需要设置上面方法)中设置,那么不管你在Deployment Info勾选没勾选横屏,viewController中重写shouldAutorotate都不会调用的。
- 如果在跟控制器中设置了上面方法,那么第一个控制器的shouldAutorotate能调用,但是往下push的控制器中的shouldAutorotate就不调用了,不管勾选没勾选横屏。
- 不管勾选没勾选横屏,如果modal一个没有实现上面三个方法的UINavigationController控制器,那么新控制器的shouldAutorotate也是不能调用,如果model一个普通的viewController控制器中的shouldAutorotate都能调用,还有如果modal一个自定义转场的控制器,也是不能调用的,例如使用我以前写的一个模仿push&pop的modal 就不行了。。。