iOS開發 轉屏控制 (shouldAutorotate/supportedInterfaceOrientations)不起作用
阿新 • • 發佈:2018-11-21
需求是這樣的:
在控制器A中, 不允許轉屏, 只能是豎屏
push到控制器B之後, 允許控制器自動旋轉螢幕幕
實現方式
正常的實現邏輯中, 只需要在控制器A中實現以下
- (BOOL)shouldAutorotate {
return NO;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
就可以實現了
但是今天遇到這麼個問題, 無論怎麼設定, 這些程式碼也執行, 但是都不起作用, 螢幕依然可以旋轉.
問題
大概的查了一下, 跟UINavigationController
, UITabBarController
相關的控制器, 會預設的走這兩個基類的轉屏方法, 自己寫的這個就不會生效了, 檢查appDelegate
中發現如下程式碼:
LCPlayerViewController *mainViewController = [[LCPlayerViewController alloc] initWithNibName:@"LCPlayerViewController" bundle:nil]; UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController]; navigationController.navigationBarHidden = YES; self.navigationController = navigationController; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; return YES;
解決方法
由於基本是UINavigationController
, 所以跟上面說的那個一致, 自己實現的shouldAutorotate
等方法不管用了, 於是解決辦法如下:
LECBaseNavigationController *navigationController = [[LECBaseNavigationController alloc] initWithRootViewController:mainViewController];
把建立的Nav變成了自己的一個Nav子類, 定義如下:
#import "LECBaseNavigationController.h" @interface LECBaseNavigationController () @end @implementation LECBaseNavigationController - (void)viewDidLoad { [super viewDidLoad]; } - (BOOL)shouldAutorotate { return self.topViewController.shouldAutorotate; } - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return self.topViewController.supportedInterfaceOrientations; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return self.topViewController.preferredInterfaceOrientationForPresentation; } @end
重寫了三個跟轉屏相關的方法, 把轉屏的控制歸還給實際的控制器, 再編譯執行, 就可以實現自己的控制器控制自己轉屏方向了.
程式碼在這
https://github.com/dfzr86/ScreenOrientationsDemo
作者:__zimu
連結:https://www.jianshu.com/p/1c8d71deded8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。