一般我們的項目都是只支持豎屏的,但最近做的項目是直播的,因此我播放的時候我需要旋轉屏幕切換橫豎屏,所以在項目設置中需要打開橫屏
Paste_Image.png
那么問題來了,項目中有很多個控制器,但我只要這個播放控制器可以橫豎屏,其他控制器不需要,此時有兩個解決辦法:
繼承實現:如果項目是新項目,可以新建一個基類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 就不行了。。。