teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

加筆及び大幅修正

2017/10/28 17:31

投稿

xAxis
xAxis

スコア1349

answer CHANGED
@@ -23,13 +23,25 @@
23
23
  ```
24
24
 
25
25
  ってなってたりしてるんですよね。なのでお手持ちのライブラリを確認して下の形ならこれから書くコードを修正するか、swift4で開発するかしてください。
26
- 以下のコードは全てswift4になります。
27
26
 
28
27
  命名ですがNCはNavigationController, VC1, VC2, VC3はそれぞれ一番目、二番目、三番目のViewControllerです。
29
28
  またNC, VC1, VC2, VC3はそれぞれStorybordでCustom Classにするかいい具合にしてください。
30
29
 
31
- ###何ともあれコード
30
+ 以下分かりにくい表現です。
31
+ デバイスの向き:iPhoneやiPad等実機(orシミュレータ)を持った時の向きです。縦向きはホームボタンが上下に、横向きはホームボタンが左右にきます。
32
+ landscape, portrait:ViewControllerの向きです。
33
+ これらは別々のものとして扱います。
32
34
 
35
+ ###これからやることの流れ
36
+
37
+ 0. まずUINavigationControllerから各々のViewControlllerにorientationの制約を与えていきます。
38
+ 例を挙げると.portraitの制約与えた時、デバイスを縦向きにしても横向きにしてもViewControllerはportraitの向きのままである、と言うことです。ViewControllerが表示された時に**強制的に横向きにすると言うわけではありません**。また、デバイスを縦向きのままVC1からVC2に画面遷移を行なってもVC2はportraitのままです。VC2に画面遷移後デバイスを横向きにするとVC2はlandscapeになります。
39
+
40
+ 0. なので次に各々のViewControllerが表示された時に(今回はviewDidAppear内で行います)強制的にViewControllerをlandscapeやportraitにします。
41
+
42
+
43
+ ###コード
44
+ 0. UINavigationControllerに制約を与えます。
33
45
  ```swift
34
46
 
35
47
  import UIKit
@@ -43,11 +55,7 @@
43
55
  override func didReceiveMemoryWarning() {
44
56
  super.didReceiveMemoryWarning()
45
57
  }
46
- //
58
+
47
- // override public var shouldAutorotate: Bool {
48
- // return true
49
- // }
50
- //
51
59
      override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
52
60
  guard let vc = visibleViewController else {
53
61
  fatalError()
@@ -74,15 +82,68 @@
74
82
 
75
83
  ```
76
84
 
77
- overrideしてるものはそれぞれどう言うものか調べてください。shouldAutorotateはデフォルトでtrueっぽいのでこのままで問題なさそうです。
78
- 以上コードでorientationの制約がかかりますが強制的に向きを変える場合は
85
+ 0. ViewController向きを強制的に変えます。
79
- 各VCに
80
86
 
81
87
  ```swift
88
+ class VC1: UIViewController {
89
+
90
+ override func viewDidLoad() {
91
+ super.viewDidLoad()
92
+ // Do any additional setup after loading the view, typically from a nib.
93
+ }
94
+
95
+ override func didReceiveMemoryWarning() {
96
+ super.didReceiveMemoryWarning()
97
+ // Dispose of any resources that can be recreated.
98
+ }
99
+
100
+ override func viewDidAppear(_ animated: Bool) {
101
+ super.viewDidAppear(animated)
102
+ let value = UIInterfaceOrientation.portrait.rawValue
103
+ UIDevice.current.setValue(value, forKey: "orientation")
104
+ }
105
+
106
+ }
107
+
108
+ class VC2: UIViewController {
109
+
110
+ override func viewDidLoad() {
111
+ super.viewDidLoad()
112
+ }
113
+
114
+ override func didReceiveMemoryWarning() {
115
+ super.didReceiveMemoryWarning()
116
+ }
117
+
118
+ override func viewDidAppear(_ animated: Bool) {
119
+ super.viewDidAppear(animated)
82
- let value = UIInterfaceOrientation.landscapeLeft.rawValue
120
+ let value = UIInterfaceOrientation.landscapeLeft.rawValue
83
- UIDevice.current.setValue(value, forKey: "orientation")
121
+ UIDevice.current.setValue(value, forKey: "orientation")
122
+ }
123
+
124
+ }
125
+
126
+ class VC3: UIViewController {
127
+
128
+ override func viewDidLoad() {
129
+ super.viewDidLoad()
130
+
131
+ // Do any additional setup after loading the view.
132
+ }
133
+
134
+ override func didReceiveMemoryWarning() {
135
+ super.didReceiveMemoryWarning()
136
+ // Dispose of any resources that can be recreated.
137
+ }
138
+
139
+ override func viewDidAppear(_ animated: Bool) {
140
+ super.viewDidAppear(animated)
141
+ let value = UIInterfaceOrientation.portrait.rawValue
142
+ UIDevice.current.setValue(value, forKey: "orientation")
143
+ }
144
+
145
+ }
84
146
  ```
85
- ってなコードを書きます。位置はviewDidAppear()がいいんじゃないでしょうかね。縦にしたい場合は.portraitで。
86
147
 
87
148
  ###動いてるとこ
88
149
  ![orientation](7dea4030b09efd00614101aea0ac661e.gif)

3

追記

2017/10/28 17:31

投稿

xAxis
xAxis

スコア1349

answer CHANGED
@@ -6,6 +6,10 @@
6
6
 
7
7
  ###事前の情報共有
8
8
 
9
+ 環境
10
+ Xcode 9.0.1
11
+ swift 4
12
+
9
13
  swift4では
10
14
 
11
15
  ```

2

修正

2017/10/27 19:16

投稿

xAxis
xAxis

スコア1349

answer CHANGED
@@ -84,5 +84,4 @@
84
84
  ![orientation](7dea4030b09efd00614101aea0ac661e.gif)
85
85
 
86
86
  ###余談
87
- Deployment Infoにあるdevice Orientationに全部チェックを入れても、逆に全部チェックを外しても動作しました。どういう流れになってるんでしょうかね。
87
+ Deployment Infoにあるdevice Orientationに全部チェックを入れても、逆に全部チェックを外しても動作しました。どういう流れになってるんでしょうかね。
88
- そして眠い。

1

誤字

2017/10/27 19:14

投稿

xAxis
xAxis

スコア1349

answer CHANGED
@@ -44,11 +44,11 @@
44
44
  // return true
45
45
  // }
46
46
  //
47
- override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
47
+     override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
48
48
  guard let vc = visibleViewController else {
49
49
  fatalError()
50
50
  }
51
- if let _ = vc as? VC2 {
51
+ if vc is VC2 {
52
52
  return .landscape
53
53
  } else {
54
54
  return .portrait