

### 実現したいこと

画面遷移したときに、それぞれの画面に対応した向きに回転させて表示したい。

### この質問はマルチポストしています

<https://teratail.com/questions/pma8xcsqcmwvvl>  
今後はマルチポストを行わないようにします。

### 前提

縦画面と横画面の複数の画面からなるアプリを開発中ですが、下記の問題を自力で解決することができなかったので、どうすればよいのかご教授をお願いしたいです。

TabBarControllerを使用しており、各画面をTabを使い画面遷移します。それぞれ専用のPageViewControllerで管理しているGraphViewController（横画面）とTopViewController（縦画面）で遷移するときに、それぞれの画面に対応した向きに回転させて表示したいのですが、下記の問題が起きています。

※各ControllerのUIはxibで作成しており、GraphViewControllerは横画面です。

[![画像の説明をここに入力](https://i.stack.imgur.com/7nKo7.png)](https://i.stack.imgur.com/7nKo7.png)

### 問題点

ビルドして最初にTopViewControllerからGraphViewControllerに遷移したときは問題なく画面が回転され横画面で表示されますが、その後TopViewControllerに戻ったときに縦画面への回転がされず横画面のままで表示されています。

### 試したこと

下記の記事を参考にしました。

[【Swift5】
特定画面で縦画面/横画面に固定させる](https://qiita.com/yannagi41/items/95b7210763489b109c9a)  
[【Swift】一画面だけ横向き固定にする](https://freelance-
style.net/%E3%80%90swift%E3%80%91%E4%B8%80%E7%94%BB%E9%9D%A2%E3%81%A0%E3%81%91%E6%A8%AA%E5%90%91%E3%81%8D%E5%9B%BA%E5%AE%9A%E3%81%AB%E3%81%99%E3%82%8B/)  
[【Swift4】特定の画面で回転を制御する方法について、サンプルを作って理解する](https://qiita.com/orimomo/items/6ab57c6706a8dbc181a1)

### コード

TabBarController

[code]

    class TabBarController: UITabBarController {
     override func viewDidLoad() {
            super.viewDidLoad()
        }
    }
    
    extension UITabBarController {
      open override var shouldAutorotate: Bool {
        if let VC = selectedViewController {
          return VC.shouldAutorotate
        }else{
          return true
        }
      }
    
      open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if let VC = selectedViewController {
          return VC.supportedInterfaceOrientations
        }else{
          return .portrait
        }
      }
    }
    
[/code]

TopPageViewController

[code]

    class TopPageViewController: UIPageViewController {
     override var shouldAutorotate: Bool {
        if let VC = controllers.first {
          return VC.shouldAutorotate
        }
        return false
      }
      
      override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if let VC = controllers.first {
          return VC.supportedInterfaceOrientations
        }
        return .portrait
      }
    
[/code]

TopViewController

[code]

    class TopViewController: UIViewController {
    　　override var shouldAutorotate: Bool {
        UIDevice.current.setValue(1, forKey: "orientation")
        return false
      }
      
      override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
          return .portrait
      }
    
[/code]

GraphPageViewController

[code]

    class GraphPageViewController: UIPageViewController {
    　　override var shouldAutorotate: Bool {
        if let VC = controllers.first {
          return VC.shouldAutorotate
        }else{
          return true
        }
      }
      
      override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if let VC = controllers.first {
          return VC.supportedInterfaceOrientations
        }else{
          return .landscapeLeft
        }
      }
    
[/code]

GraphViewController

[code]

    class GraphViewController: UIViewController {
    　　　override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    
        if(UIDevice.current.orientation.rawValue == 4){
          UIDevice.current.setValue(4, forKey: "orientation")
          return .landscapeLeft
        }
        else {
          UIDevice.current.setValue(3, forKey: "orientation")
          return .landscapeRight
        }
      }
     
      override var shouldAutorotate: Bool {
        if(UIDevice.current.orientation.rawValue == 1){
          return false
        }
        else{
          return true
        }
      }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
       UIDevice.current.setValue(4, forKey: "orientation")
       print(supportedInterfaceOrientations)
    }
    
[/code]


CC BY-SA 4.0
2023-06-06T09:26:58.513
95115
2023-06-14T08:33:44.503
2023-06-14T08:33:44.503
58618
58618
question
swift ios xcode
Swift 画面遷移時に画面を回転させて表示したい