実現したいこと
画面遷移したときに、それぞれの画面に対応した向きに回転させて表示したい。
前提
iosアプリ開発の初心者です。縦画面と横画面の複数の画面からなるアプリを開発中ですが、下記の問題を自力で解決することができなかったので、どうすればよいのかご教授をお願いしたいです。
TabBarControllerを使用しており、各画面をTabを使い画面遷移します。それぞれ専用のPageViewControllerで管理しているGraphViewController(横画面)とTopViewController(縦画面)で遷移するときに、それぞれの画面に対応した向きに回転させて表示したいのですが、下記の問題が起きています。
※各ControllerのUIはxibで作成しており、GraphViewControllerは横画面です。
マルチポストの理由
terarailのヘルプを確認していませんでした。
今後はマルチポストを行わないようにします。
https://ja.stackoverflow.com/questions/95115/swift-%e7%94%bb%e9%9d%a2%e9%81%b7%e7%a7%bb%e6%99%82%e3%81%ab%e7%94%bb%e9%9d%a2%e3%82%92%e5%9b%9e%e8%bb%a2%e3%81%95%e3%81%9b%e3%81%a6%e8%a1%a8%e7%a4%ba%e3%81%97%e3%81%9f%e3%81%84
発生している問題
ビルドして最初にTopViewControllerからGraphViewControllerに遷移したときは問題なく画面が回転され横画面で表示されますが、その後TopViewControllerに戻ったときに縦画面への回転がされず横画面のままで表示されています。
該当のソースコード
TabBarController
1class TabBarController: UITabBarController { 2 override func viewDidLoad() { 3 super.viewDidLoad() 4 } 5} 6 7extension UITabBarController { 8 open override var shouldAutorotate: Bool { 9 if let VC = selectedViewController { 10 return VC.shouldAutorotate 11 }else{ 12 return true 13 } 14 } 15 16 open override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 17 if let VC = selectedViewController { 18 return VC.supportedInterfaceOrientations 19 }else{ 20 return .portrait 21 } 22 } 23}
TopPageViewController
1class TopPageViewController: UIPageViewController { 2 override var shouldAutorotate: Bool { 3 if let VC = controllers.first { 4 return VC.shouldAutorotate 5 } 6 return false 7 } 8 9 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 10 if let VC = controllers.first { 11 return VC.supportedInterfaceOrientations 12 } 13 return .portrait 14 }
TopViewController
1class TopViewController: UIViewController { 2 override var shouldAutorotate: Bool { 3 UIDevice.current.setValue(1, forKey: "orientation") 4 return false 5 } 6 7 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 8 return .portrait 9 }
GraphPageViewController
1lass GraphPageViewController: UIPageViewController { 2 override var shouldAutorotate: Bool { 3 if let VC = controllers.first { 4 return VC.shouldAutorotate 5 }else{ 6 return true 7 } 8 } 9 10 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 11 if let VC = controllers.first { 12 return VC.supportedInterfaceOrientations 13 }else{ 14 return .landscapeLeft 15 } 16 }
GraphViewController
1class GraphViewController: UIViewController { 2 override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 3 4 if(UIDevice.current.orientation.rawValue == 4){ 5 UIDevice.current.setValue(4, forKey: "orientation") 6 return .landscapeLeft 7 } 8 else { 9 UIDevice.current.setValue(3, forKey: "orientation") 10 return .landscapeRight 11 } 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 23override func viewDidLoad() { 24 super.viewDidLoad() 25 26 UIDevice.current.setValue(4, forKey: "orientation") 27 print(supportedInterfaceOrientations) 28}
試したこと
画面回転の実装に際し、以下の記事を参考にしました。
【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
あなたの回答
tips
プレビュー