NavigationController
配下の3つのコントローラーが有り
ViewControllerA
ViewControllerB
ViewControllerC
A
-> B
-> C
と遷移します。
Bだけ、横表示にして、他のAとCは縦で表示したいのですが
中々うまくいきません。Cから戻った時も、Bは横、Aは縦に
なってほしいです。
環境は、Xcode9.0.1
Swift3.0
です。
NavigationController
配下のviewcontroller
をひとつだけ
横表示にする方法をご存知の方がいらっしゃいましたら
ご教授頂けませんでしょうか?
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
このorientationの話題なんだか情報まとまってない感のある話題ですよね。
それに某ネット通販サイトにある動画サービスをiPhoneで利用すると、動画が流れる時に強制的にlandscapeになるのが前から気になっていたのでちょっとやってみました。
残念ながらswift4なので(起動および動作確認済みですが)swift3で使えるかは謎です。
なので
###事前の情報共有
環境
Xcode 9.0.1
swift 4
swift4では
public var shouldAutorotate: Bool { get }
となっていますがネットの情報を調べていると
open func shouldAutorotate() -> Bool
ってなってたりしてるんですよね。なのでお手持ちのライブラリを確認して下の形ならこれから書くコードを修正するか、swift4で開発するかしてください。
命名ですがNCはNavigationController, VC1, VC2, VC3はそれぞれ一番目、二番目、三番目のViewControllerです。
またNC, VC1, VC2, VC3はそれぞれStorybordでCustom Classにするかいい具合にしてください。
以下は分かりにくい表現です。
デバイスの向き:iPhoneやiPad等実機(orシミュレータ)を持った時の向きです。縦向きはホームボタンが上下に、横向きはホームボタンが左右にきます。
landscape, portrait:ViewControllerの向きです。
これらは別々のものとして扱います。
###これからやることの流れ
- まずUINavigationControllerから各々のViewControlllerにorientationの制約を与えていきます。
例を挙げると.portraitの制約与えた時、デバイスを縦向きにしても横向きにしてもViewControllerはportraitの向きのままである、と言うことです。ViewControllerが表示された時に強制的に横向きにすると言うわけではありません。また、デバイスを縦向きのままVC1からVC2に画面遷移を行なってもVC2はportraitのままです。VC2に画面遷移後デバイスを横向きにするとVC2はlandscapeになります。
- なので次に各々のViewControllerが表示された時に(今回はviewDidAppear内で行います)強制的にViewControllerをlandscapeやportraitにします。
###コード
0. UINavigationControllerに制約を与えます。
swift
1 2import UIKit 3 4class NC: UINavigationController { 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 } 9 10 override func didReceiveMemoryWarning() { 11 super.didReceiveMemoryWarning() 12 } 13 14 override public var supportedInterfaceOrientations: UIInterfaceOrientationMask { 15 guard let vc = visibleViewController else { 16 fatalError() 17 } 18 if vc is VC2 { 19 return .landscape 20 } else { 21 return .portrait 22 } 23 } 24 25 override public var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { 26 guard let vc = visibleViewController else { 27 fatalError() 28 } 29 if vc is VC2 { 30 return .landscapeLeft 31 } else { 32 return .portrait 33 } 34 } 35 36} 37
- ViewControllerの向きを強制的に変えます。
swift
1class VC1: UIViewController { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 // Do any additional setup after loading the view, typically from a nib. 6 } 7 8 override func didReceiveMemoryWarning() { 9 super.didReceiveMemoryWarning() 10 // Dispose of any resources that can be recreated. 11 } 12 13 override func viewDidAppear(_ animated: Bool) { 14 super.viewDidAppear(animated) 15 let value = UIInterfaceOrientation.portrait.rawValue 16 UIDevice.current.setValue(value, forKey: "orientation") 17 } 18 19} 20 21class VC2: UIViewController { 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 } 26 27 override func didReceiveMemoryWarning() { 28 super.didReceiveMemoryWarning() 29 } 30 31 override func viewDidAppear(_ animated: Bool) { 32 super.viewDidAppear(animated) 33 let value = UIInterfaceOrientation.landscapeLeft.rawValue 34 UIDevice.current.setValue(value, forKey: "orientation") 35 } 36 37} 38 39class VC3: UIViewController { 40 41 override func viewDidLoad() { 42 super.viewDidLoad() 43 44 // Do any additional setup after loading the view. 45 } 46 47 override func didReceiveMemoryWarning() { 48 super.didReceiveMemoryWarning() 49 // Dispose of any resources that can be recreated. 50 } 51 52 override func viewDidAppear(_ animated: Bool) { 53 super.viewDidAppear(animated) 54 let value = UIInterfaceOrientation.portrait.rawValue 55 UIDevice.current.setValue(value, forKey: "orientation") 56 } 57 58}
###余談
Deployment Infoにあるdevice Orientationに全部チェックを入れても、逆に全部チェックを外しても動作しました。どういう流れになってるんでしょうかね。
投稿2017/10/27 18:59
編集2017/10/28 17:31総合スコア1349
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/28 13:12
2017/10/28 14:55
2017/10/28 16:14
2017/10/28 17:04