ほとんど質問者様と同じですが以下のようにしてみてはどうでしょうか?
まずプロジェクト単位(info.plist)のデバイスの向きの設定はPortrait
のみに設定します。
これでLaunchScreenは縦のみがサポートされます。
次にAppDelegate
内で以下の記述をしてデバイスの向きの設定を変更します。
Swift
1class AppDelegate: UIResponder, UIApplicationDelegate {
2
3 var window: UIWindow?
4
5
6 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
7 // Override point for customization after application launch.
8 return true
9 }
10
11 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
12 return UIInterfaceOrientationMask.allButUpsideDown
13 }
14}
15
16
そして縦のみをサポートしたいViewControllerは以下のようにして縦のみをサポートするようにします。
Swift
1class ViewController: UIViewController {
2
3 override var shouldAutorotate: Bool {
4 return true
5 }
6
7 override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
8 return .portrait
9 }
10
11 override func viewDidLoad() {
12 super.viewDidLoad()
13 }
14}
15
回転をサポートするViewControllerでは以下のようにします。
Swift
1class ViewController: UIViewController {
2
3 override var shouldAutorotate: Bool {
4 return true
5 }
6
7 override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
8 return .allButUpsideDown
9 }
10
11 override func viewDidLoad() {
12 super.viewDidLoad()
13 }
14}
15
ただこれらがUINavigationController
、またはUITabBarController
の管理下にある場合
そのままでは各ViewControllerで設定した値が反映されないので対策する必要があります。
UINavigationController
を使って試していたので、
以下のようなExtensionを定義して各ViewControllerの設定を反映させるようにしました。
Swift
1extension UINavigationController {
2
3 open override var shouldAutorotate: Bool {
4 guard let viewController = self.visibleViewController else { return true }
5 return viewController.shouldAutorotate
6 }
7
8 open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
9 guard let viewController = self.visibleViewController else { return .all }
10 return viewController.supportedInterfaceOrientations
11 }
12}