1. 程式人生 > >iOS開發 轉屏控制 (shouldAutorotate/supportedInterfaceOrientations)不起作用

iOS開發 轉屏控制 (shouldAutorotate/supportedInterfaceOrientations)不起作用

需求是這樣的:
在控制器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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。