回答編集履歴

4

加筆及び大幅修正

2017/10/28 17:31

投稿

xAxis
xAxis

スコア1349

test CHANGED
@@ -48,8 +48,6 @@
48
48
 
49
49
  ってなってたりしてるんですよね。なのでお手持ちのライブラリを確認して下の形ならこれから書くコードを修正するか、swift4で開発するかしてください。
50
50
 
51
- 以下のコードは全てswift4になります。
52
-
53
51
 
54
52
 
55
53
  命名ですがNCはNavigationController, VC1, VC2, VC3はそれぞれ一番目、二番目、三番目のViewControllerです。
@@ -58,9 +56,35 @@
58
56
 
59
57
 
60
58
 
61
- ###何ともあれコード
62
-
63
-
59
+ 以下分かりにくい表現です。
60
+
61
+ デバイスの向き:iPhoneやiPad等実機(orシミュレータ)を持った時の向きです。縦向きはホームボタンが上下に、横向きはホームボタンが左右にきます。
62
+
63
+ landscape, portrait:ViewControllerの向きです。
64
+
65
+ これらは別々のものとして扱います。
66
+
67
+
68
+
69
+ ###これからやることの流れ
70
+
71
+
72
+
73
+ 0. まずUINavigationControllerから各々のViewControlllerにorientationの制約を与えていきます。
74
+
75
+ 例を挙げると.portraitの制約与えた時、デバイスを縦向きにしても横向きにしてもViewControllerはportraitの向きのままである、と言うことです。ViewControllerが表示された時に**強制的に横向きにすると言うわけではありません**。また、デバイスを縦向きのままVC1からVC2に画面遷移を行なってもVC2はportraitのままです。VC2に画面遷移後デバイスを横向きにするとVC2はlandscapeになります。
76
+
77
+
78
+
79
+ 0. なので次に各々のViewControllerが表示された時に(今回はviewDidAppear内で行います)強制的にViewControllerをlandscapeやportraitにします。
80
+
81
+
82
+
83
+
84
+
85
+ ###コード
86
+
87
+ 0. UINavigationControllerに制約を与えます。
64
88
 
65
89
  ```swift
66
90
 
@@ -88,15 +112,7 @@
88
112
 
89
113
  }
90
114
 
91
- //
115
+
92
-
93
- // override public var shouldAutorotate: Bool {
94
-
95
- // return true
96
-
97
- // }
98
-
99
- //
100
116
 
101
117
      override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
102
118
 
@@ -150,23 +166,129 @@
150
166
 
151
167
 
152
168
 
153
- overrideしてるものはそれぞれどう言うものか調べてください。shouldAutorotateはデフォルトでtrueっぽいのでこのままで問題なさそうです。
154
-
155
- 以上のコードでorientation制約がかかりますが強制的に向きを変える場合は
169
+ 0. ViewController向きを強制的に変えます。
156
-
157
- 各VCに
158
170
 
159
171
 
160
172
 
161
173
  ```swift
162
174
 
175
+ class VC1: UIViewController {
176
+
177
+
178
+
179
+ override func viewDidLoad() {
180
+
181
+ super.viewDidLoad()
182
+
183
+ // Do any additional setup after loading the view, typically from a nib.
184
+
185
+ }
186
+
187
+
188
+
189
+ override func didReceiveMemoryWarning() {
190
+
191
+ super.didReceiveMemoryWarning()
192
+
193
+ // Dispose of any resources that can be recreated.
194
+
195
+ }
196
+
197
+
198
+
199
+ override func viewDidAppear(_ animated: Bool) {
200
+
201
+ super.viewDidAppear(animated)
202
+
203
+ let value = UIInterfaceOrientation.portrait.rawValue
204
+
205
+ UIDevice.current.setValue(value, forKey: "orientation")
206
+
207
+ }
208
+
209
+
210
+
211
+ }
212
+
213
+
214
+
215
+ class VC2: UIViewController {
216
+
217
+
218
+
219
+ override func viewDidLoad() {
220
+
221
+ super.viewDidLoad()
222
+
223
+ }
224
+
225
+
226
+
227
+ override func didReceiveMemoryWarning() {
228
+
229
+ super.didReceiveMemoryWarning()
230
+
231
+ }
232
+
233
+
234
+
235
+ override func viewDidAppear(_ animated: Bool) {
236
+
237
+ super.viewDidAppear(animated)
238
+
163
- let value = UIInterfaceOrientation.landscapeLeft.rawValue
239
+ let value = UIInterfaceOrientation.landscapeLeft.rawValue
164
-
240
+
165
- UIDevice.current.setValue(value, forKey: "orientation")
241
+ UIDevice.current.setValue(value, forKey: "orientation")
242
+
166
-
243
+ }
244
+
245
+
246
+
247
+ }
248
+
249
+
250
+
251
+ class VC3: UIViewController {
252
+
253
+
254
+
255
+ override func viewDidLoad() {
256
+
257
+ super.viewDidLoad()
258
+
259
+
260
+
261
+ // Do any additional setup after loading the view.
262
+
263
+ }
264
+
265
+
266
+
267
+ override func didReceiveMemoryWarning() {
268
+
269
+ super.didReceiveMemoryWarning()
270
+
271
+ // Dispose of any resources that can be recreated.
272
+
273
+ }
274
+
275
+
276
+
277
+ override func viewDidAppear(_ animated: Bool) {
278
+
279
+ super.viewDidAppear(animated)
280
+
281
+ let value = UIInterfaceOrientation.portrait.rawValue
282
+
283
+ UIDevice.current.setValue(value, forKey: "orientation")
284
+
285
+ }
286
+
287
+
288
+
289
+ }
290
+
167
- ```
291
+ ```
168
-
169
- ってなコードを書きます。位置はviewDidAppear()がいいんじゃないでしょうかね。縦にしたい場合は.portraitで。
170
292
 
171
293
 
172
294
 

3

追記

2017/10/28 17:31

投稿

xAxis
xAxis

スコア1349

test CHANGED
@@ -11,6 +11,14 @@
11
11
 
12
12
 
13
13
  ###事前の情報共有
14
+
15
+
16
+
17
+ 環境
18
+
19
+ Xcode 9.0.1
20
+
21
+ swift 4
14
22
 
15
23
 
16
24
 

2

修正

2017/10/27 19:16

投稿

xAxis
xAxis

スコア1349

test CHANGED
@@ -171,5 +171,3 @@
171
171
  ###余談
172
172
 
173
173
  Deployment Infoにあるdevice Orientationに全部チェックを入れても、逆に全部チェックを外しても動作しました。どういう流れになってるんでしょうかね。
174
-
175
- そして眠い。

1

誤字

2017/10/27 19:14

投稿

xAxis
xAxis

スコア1349

test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  //
92
92
 
93
- override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
93
+     override public var supportedInterfaceOrientations: UIInterfaceOrientationMask {
94
94
 
95
95
  guard let vc = visibleViewController else {
96
96
 
@@ -98,7 +98,7 @@
98
98
 
99
99
  }
100
100
 
101
- if let _ = vc as? VC2 {
101
+ if vc is VC2 {
102
102
 
103
103
  return .landscape
104
104