shouldAutorotate調用問題

一般我們的項目都是只支持豎屏的,但最近做的項目是直播的,因此我播放的時候我需要旋轉屏幕切換橫豎屏,所以在項目設置中需要打開橫屏

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 就不行了。。。

至于為什么會出現上面的問題,我也沒搞懂這個方法的調用時機,如果你知道,歡迎大家留言??還是那句,歡迎大家關注我,喜歡給個like

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容