実現したいこと
画面遷移したときに、それぞれの画面に対応した向きに回転させて表示したい。
前提
IOSアプリ開発の初心者です。縦画面と横画面の複数の画面からなるアプリを開発中ですが、上記の機能を自力で実装することができなかったので、どうすればよいのかご教授をお願いさせていただきたいです。
TabBarControllerを使用しており、各画面をTabを使い画面遷移します。GraphViewController(横画面)とPageViewControllerを使用して表示しているTopViewController(縦画面)で遷移するときに、それぞれの画面に対応した向きに回転させて表示したいのですが、下記の問題が起きています。

※各ControllerのUIはxibで作成しており、GraphViewControllerは横画面です。
発生している問題
ビルドして最初にTopViewControllerからGraphViewControllerに遷移したときは問題なく画面が回転され横画面で表示されますが、その後TopViewControllerに戻ったときに縦画面への回転がされず横画面のままで表示されています。
該当のソースコード
TopPageViewController
1class TopPageViewController: UIPageViewController { 2 private var controllers: [UIViewController] = [] 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 7 self.initTopPageViewContoller() 8 9 // Do any additional setup after loading the view. 10 } 11 12 private func initTopPageViewContoller() { 13 let topVC = storyboard!.instantiateViewController(withIdentifier: "TopView") as! TopViewController 14 15 self.controllers = [topVC] 16 17 setViewControllers([self.controllers[0]], direction: .forward, animated: true, completion: nil) 18 19 self.dataSource = self 20 } 21} 22 23extension TopPageViewController: UIPageViewControllerDataSource { 24 func presentationCount(for pageViewController: UIPageViewController) -> Int { 25 return self.controllers.count 26 } 27 28 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 29 return nil 30 } 31 32 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 33 return nil 34 } 35} 36 37//TopViewControllerの回転制御 38extension TopPageViewController { 39 open override var shouldAutorotate: Bool{ 40 guard let topVC = self.controllers.first 41 else { 42 return false 43 } 44 return topVC.shouldAutorotate 45 } 46 47 override open var supportedInterfaceOrientations: UIInterfaceOrientationMask { 48 guard let topVC = self.controllers.first 49 else { 50 return .portrait 51 } 52 return topVC.supportedInterfaceOrientations 53 } 54}
TopViewController
1class TopViewController: UIViewController { 2 var topView = TopView() 3 4 override var shouldAutorotate: Bool { 5 UIDevice.current.setValue(1, forKey: "orientation") 6 return false 7 } 8 9 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 10 return .portrait 11 } 12 13override func viewDidLoad() { 14 super.viewDidLoad() 15 16 UIDevice.current.setValue(1, forKey: "orientation") 17 print(supportedInterfaceOrientations) 18 19 }
GraphViewController
1class GraphViewController: UIViewController { 2 var graphView = GraphView() 3 4 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 5 if(UIDevice.current.orientation.rawValue == 4){ 6 UIDevice.current.setValue(4, forKey: "orientation") 7 return .landscapeLeft 8 } 9 else { 10 UIDevice.current.setValue(3, forKey: "orientation") 11 return .landscapeRight 12 } 13 } 14 override var shouldAutorotate: Bool { 15 if(UIDevice.current.orientation.rawValue == 1){ 16 return false 17 } 18 else{ 19 return true 20 } 21 } 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 26 UIDevice.current.setValue(4, forKey: "orientation") 27 print(supportedInterfaceOrientations) 28 29 // Do any additional setup after loading the view. 30 } 31
試したこと
画面回転の実装に際し、以下の記事を参考にしました。
【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/

0 コメント