shouldAutorotate() が呼ばれない


問題

[UITabViewController]->[UINavigationController]->[UIViewController]という構造になっているとき、UIViewControllerを継承したViewの中で

override var shouldAutorotate: Bool{
    return false
}

を書いても、画面が回転してしまう。
UIViewControllerが回っていなくても、その下にあるUITabViewControllerとUINavigationControllerが回ってしまっているからだ。

解決方法

これをどこかに追記する。ちなみにshouldAutorotate以外にも個人的に書いておいたほうがいいと思ってるものも入ってる。

extension UINavigationController {
    open override var shouldAutorotate: Bool {
        guard let viewCtrl = self.visibleViewController else{return true}
        return viewCtrl.shouldAutorotate
    }
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        guard let viewCtrl = self.visibleViewController else{return .all}
        return viewCtrl.supportedInterfaceOrientations
    }
}

extension UITabBarController{
    open override var shouldAutorotate: Bool {
        guard let viewCtrls = self.viewControllers else{return true}
        return viewCtrls[selectedIndex].shouldAutorotate
    }
    open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        guard let viewCtrls = self.viewControllers else{return .all}
        return viewCtrls[selectedIndex].supportedInterfaceOrientations
    }
}

コメント

UINavigationControllerのextensionを追記するのはどのサイトでも出てきたけど、UITabBarControllerがあるのが盲点だった。ちょっと書き方が複雑だったように思う。

上の書き方はSwift3.0だけど、Swift2系なら

open override var なになに: なになに{

public override func なになに() -> なになに{

に書き換えればいい。