【XCode】iOSアプリのTabBarControllerとNavigationControllerの回転処理について

8年前にiOS6になってViewControllerの回転処理が大きく変更となりました
その際、NavigationControllerの回転をCategory(SwiftではExtension)して回転処理を上書きしちゃうというものを書いておりました


あれから8年たって同様の対応をもはやおまじないのように入れておりましたが
別チームのメンバーからXCodeでDebug実行時で意図しない回転をするが、
Macと切断してアプリ単体で動作させると意図通りの回転をする という謎の報告をうけました

構成は
UIWindowのRootViewControllerはUITabBarController
UITabBarControllerの下にUINavigationControllerがあり
その下にViewControllerが連なっているものでした

Debug実行時にBreakを仕込んでみてみると
ViewControllerの「supportedInterfaceOritentations」メソッドにBreakしません
→コールされていない

一つ上のNavigationControllerのExtensionに実装している「supportedInterfaceOritentations」メソッドにもBreakしません
根本的にTabBarControllerのExtensionに実装している「supportedInterfaceOritentations」メソッドにもBreakしませんでした

たたみます

これはなにかあると思いDeveloperDocumentをみていくと

TabBarController、NavigationControllerにそれぞれiOS7以降から
専用のサポートしている端末向き情報を返すメソッドが用意されていました

TabBarController

NavigationController

ということで
上記メソッドを使用すべく
UITabBarControllerDelegateとUINavigationControllerDelegateを実装した継承クラスを用意し、
Storyboardに指定している各TabBarControllerとNavigationControllerを置き換えてみたところ
意図通りに動作

メソッドの中身は下記のとおり

TabBarController
    func tabBarControllerSupportedInterfaceOrientations(_ tabBarController: UITabBarController) -> UIInterfaceOrientationMask {
// 選択されたタブのViewControllerを取得
if let viewController = selectedViewController {
return viewController.supportedInterfaceOrientations
} else {
return .allButUpsideDown
}
}

NavigationController
    func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
// NavigationControllerにぶら下がっているViewControllerを取得
if let viewController = viewControllers.last {
return viewController.supportedInterfaceOrientations
} else {
return .allButUpsideDown
}
}



この記事へのコメント