質問編集履歴

1

コードを画像ではなくテキストで入力した

2021/06/06 08:54

投稿

satoshi2019
satoshi2019

スコア13

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  下記参照のようにそれぞれのViewControllerのコードは同じ構成になっていますが、
18
18
 
19
- 画面遷移させた時に画面遷移前の再生を止めてスライダーを再生前に戻したいのです。
19
+ 画面遷移させた時に画面遷移前の再生を止めてスライダーを再生前に戻したいのです(ストップボタンを押した時と同じ処理でも良いです)
20
20
 
21
21
  どのようなコードをどこに打てば良いのか・・。
22
22
 
@@ -26,22 +26,304 @@
26
26
 
27
27
  PageViewControllewのコード
28
28
 
29
+ ```import UIKit
30
+
31
+
32
+
33
+ class PageViewController: UIPageViewController {
34
+
35
+
36
+
37
+ // ① PageViewで表示するViewControllerを格納する配列を定義
38
+
39
+ private var controllers: [UIViewController] = []
40
+
41
+
42
+
43
+ override func viewDidLoad() {
44
+
45
+ super.viewDidLoad()
46
+
47
+
48
+
49
+ self.initPageViewController()
50
+
51
+ }
52
+
53
+
54
+
55
+ /// PageViewControllerの初期化処理
56
+
57
+ private func initPageViewController() {
58
+
59
+
60
+
61
+ // ② PageViewControllerで表示するViewControllerをインスタンス化する
62
+
63
+ let firstVC = storyboard!.instantiateViewController(withIdentifier: "FirstView") as! ViewController
64
+
65
+ let secondVC = storyboard!.instantiateViewController(withIdentifier: "SecondView") as! SecondViewController
66
+
67
+ let ThirdVC = storyboard!.instantiateViewController(withIdentifier: "ThirdView") as! ThirdViewController
68
+
69
+
70
+
71
+ // ③ インスタンス化したViewControllerを配列に保存する
72
+
73
+ self.controllers = [ firstVC, secondVC, ThirdVC ]
74
+
75
+
76
+
77
+ // ④ 最初に表示するViewControllerを指定する
78
+
79
+ setViewControllers([self.controllers[0]], direction: .forward, animated: true, completion: nil)
80
+
81
+
82
+
29
- ![イメージ説明](0393007de178b11e4e6fcdab6592a3ed.png)
83
+ // ④ PageViewControllerのDataSourceを関連付ける
30
-
84
+
31
- ![イメージ説明](1a9d0ae2d48495d578274cffdad307b3.png)
85
+ self.dataSource = self
86
+
32
-
87
+ }
88
+
89
+
90
+
91
+ }
92
+
93
+
94
+
33
- ![イメージ説明](2c2155a2fd55cf3b38459c7f9a22f420.png)
95
+ // ⑤ PageViewControllerのDataSourceを定義
96
+
34
-
97
+ // MARK: - UIPageViewController DataSource
98
+
35
-
99
+ extension PageViewController: UIPageViewControllerDataSource {
100
+
101
+
102
+
103
+ /// ページ数
104
+
105
+ func presentationCount(for pageViewController: UIPageViewController) -> Int {
106
+
107
+ return self.controllers.count
108
+
109
+ }
110
+
111
+
112
+
113
+ /// 左にスワイプ(進む)
114
+
115
+ func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
116
+
117
+ if let index = self.controllers.firstIndex(of: viewController),
118
+
119
+ index < self.controllers.count - 1 {
120
+
121
+ return self.controllers[index + 1]
122
+
123
+ } else {
124
+
125
+ return nil
126
+
127
+ }
128
+
129
+ }
130
+
131
+
132
+
133
+ /// 右にスワイプ (戻る)
134
+
135
+ func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
136
+
137
+ if let index = self.controllers.firstIndex(of: viewController),
138
+
139
+ index > 0 {
140
+
141
+ return self.controllers[index - 1]
142
+
143
+ } else {
144
+
145
+ return nil
146
+
147
+ }
148
+
149
+ }
150
+
151
+
152
+
153
+ }
154
+
155
+
156
+
157
+ コード
158
+
159
+ ```
36
160
 
37
161
  ViewConerollerのコードは1つのViewcontrollerを提示しますが、オードの構成は
38
162
 
39
163
  ViewController3とも同じになっています。mp3ファイル名だけ変えています。
40
164
 
165
+ ```
166
+
167
+ import UIKit
168
+
169
+ import AVFoundation
170
+
171
+
172
+
173
+ class ViewController: UIViewController{
174
+
175
+
176
+
177
+ // MARK: 配列に曲のURLを入れておく
178
+
179
+ let musicPaths = [
180
+
181
+ Bundle.main.bundleURL.appendingPathComponent("1.mp3"),
182
+
183
+ Bundle.main.bundleURL.appendingPathComponent("2.mp3"),
184
+
185
+ Bundle.main.bundleURL.appendingPathComponent("3.mp3")
186
+
187
+ ]
188
+
189
+ // MARK: どの曲が選ばれているのかを示す変数
190
+
191
+ var selectedMusic = 0
192
+
193
+
194
+
195
+ @IBOutlet weak var startButton: UIButton!
196
+
197
+ @IBOutlet weak var stopButton: UIButton!
198
+
199
+
200
+
201
+ var musicPlayer = AVAudioPlayer()
202
+
203
+
204
+
205
+ @IBOutlet weak var labelRate: UILabel!
206
+
207
+ @IBOutlet weak var sliderRate: UISlider!
208
+
209
+ @IBAction func sliderRateMove(_ sender: UISlider) {
210
+
211
+ musicPlayer.rate = sliderRate.value
212
+
213
+ labelRate.text = String(format: "×%.1f",sliderRate.value)
214
+
215
+ }
216
+
217
+
218
+
219
+ override func viewDidLoad() {
220
+
221
+ super.viewDidLoad()
222
+
223
+
224
+
225
+ // Do any additional setup after loading the view.
226
+
227
+ musicPlayer = AVAudioPlayer()
228
+
229
+ musicPlayer.enableRate = true
230
+
231
+ // MARK: STOPボタンを選択できないようにする
232
+
233
+ stopButton.isEnabled = false
234
+
235
+ }
236
+
237
+ @IBAction func start(_ sender: Any) {
238
+
239
+ do{
240
+
241
+ // 配列に入っている URL のうち、選択している曲の URL を渡す
242
+
243
+ musicPlayer = try AVAudioPlayer(contentsOf: musicPaths[selectedMusic])
244
+
245
+ musicPlayer.enableRate = true
246
+
247
+
248
+
249
+ } catch {
250
+
251
+ print("エラー")
252
+
253
+ }
254
+
255
+
256
+
257
+ //numberOfLoopsに-1を指定すると無限ループする。
258
+
259
+ musicPlayer.numberOfLoops = -1
260
+
261
+ musicPlayer.play()
262
+
263
+
264
+
265
+ // MARK: STARTボタンを選択された状態にする
266
+
267
+ startButton.isSelected = true
268
+
41
- ![イメージ説明](a1cb4a5effcf2cbfac0cb058b77fb08f.png)
269
+ //startButton.backgroundColor = .red
270
+
42
-
271
+ // MARK: STOP ボタンを選択できるようにする
272
+
273
+ stopButton.isEnabled = true
274
+
275
+ }
276
+
277
+ @IBAction func stop(_ sender: Any) {
278
+
279
+ musicPlayer.stop()
280
+
281
+ // MARK: START ボタンの状態を戻す
282
+
283
+ startButton.isSelected = false
284
+
285
+
286
+
287
+ // MARK: STOP ボタンを選択できないようにする
288
+
289
+ stopButton.isEnabled = false
290
+
291
+ // ボタンを押下時にスライダーの値を0に戻す
292
+
43
- ![イメージ説明](a96ebcbb15529374a78dc4eeb59311a2.png)
293
+ sliderRate.setValue(1, animated: true)
294
+
44
-
295
+ }
296
+
297
+ }
298
+
299
+ // MARK: 押したボタンによって選択する曲を変える
300
+
301
+ // 今回は曲を変更したら現在演奏している曲は停止させる}
302
+
45
- ![イメージ説明](71f2de3fef7e758c7dc5a5937ba33217.png)
303
+ @IBAction func selectOne(_ sender: Any) {
304
+
305
+
306
+
46
-
307
+ selectedMusic = 0
308
+
309
+ musicPlayer.stop()
310
+
311
+ // ボタンを押下時にスライダーの値を0に戻す
312
+
47
- ![イメージ説明](c4d787421359ef84342ea214fcdc3d68.png)
313
+ sliderRate.setValue(1, animated: true)
314
+
315
+ // MARK: START ボタンの状態を戻す
316
+
317
+ startButton.isSelected = false
318
+
319
+ // MARK: STOP ボタンを選択できないようにする
320
+
321
+ stopButton.isEnabled = false
322
+
323
+ }
324
+
325
+ }
326
+
327
+ コード
328
+
329
+ ```