よろしくお願いします。
シンプルな音楽アプリを作っています。
PageViewControllerでViewControllerを3つ繋ぎました。
下記参照のようにそれぞれのViewControllerのコードは同じ構成になっていますが、
画面遷移させた時に画面遷移前の再生を止めてスライダーを再生前に戻したいのです(ストップボタンを押した時と同じ処理でも良いです)。
どのようなコードをどこに打てば良いのか・・。
よろしければ教えていただければうれしいです。
PageViewControllewのコード
import
1 2class PageViewController: UIPageViewController { 3 4 // ① PageViewで表示するViewControllerを格納する配列を定義 5 private var controllers: [UIViewController] = [] 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 10 self.initPageViewController() 11 } 12 13 /// PageViewControllerの初期化処理 14 private func initPageViewController() { 15 16 // ② PageViewControllerで表示するViewControllerをインスタンス化する 17 let firstVC = storyboard!.instantiateViewController(withIdentifier: "FirstView") as! ViewController 18 let secondVC = storyboard!.instantiateViewController(withIdentifier: "SecondView") as! SecondViewController 19 let ThirdVC = storyboard!.instantiateViewController(withIdentifier: "ThirdView") as! ThirdViewController 20 21 // ③ インスタンス化したViewControllerを配列に保存する 22 self.controllers = [ firstVC, secondVC, ThirdVC ] 23 24 // ④ 最初に表示するViewControllerを指定する 25 setViewControllers([self.controllers[0]], direction: .forward, animated: true, completion: nil) 26 27 // ④ PageViewControllerのDataSourceを関連付ける 28 self.dataSource = self 29 } 30 31} 32 33// ⑤ PageViewControllerのDataSourceを定義 34// MARK: - UIPageViewController DataSource 35extension PageViewController: UIPageViewControllerDataSource { 36 37 /// ページ数 38 func presentationCount(for pageViewController: UIPageViewController) -> Int { 39 return self.controllers.count 40 } 41 42 /// 左にスワイプ(進む) 43 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 44 if let index = self.controllers.firstIndex(of: viewController), 45 index < self.controllers.count - 1 { 46 return self.controllers[index + 1] 47 } else { 48 return nil 49 } 50 } 51 52 /// 右にスワイプ (戻る) 53 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 54 if let index = self.controllers.firstIndex(of: viewController), 55 index > 0 { 56 return self.controllers[index - 1] 57 } else { 58 return nil 59 } 60 } 61 62} 63 64コード
ViewConerollerのコードは1つのViewcontrollerを提示しますが、オードの構成は
ViewController3とも同じになっています。mp3ファイル名だけ変えています。
import UIKit import AVFoundation class ViewController: UIViewController{ // MARK: 配列に曲のURLを入れておく let musicPaths = [ Bundle.main.bundleURL.appendingPathComponent("1.mp3"), Bundle.main.bundleURL.appendingPathComponent("2.mp3"), Bundle.main.bundleURL.appendingPathComponent("3.mp3") ] // MARK: どの曲が選ばれているのかを示す変数 var selectedMusic = 0 @IBOutlet weak var startButton: UIButton! @IBOutlet weak var stopButton: UIButton! var musicPlayer = AVAudioPlayer() @IBOutlet weak var labelRate: UILabel! @IBOutlet weak var sliderRate: UISlider! @IBAction func sliderRateMove(_ sender: UISlider) { musicPlayer.rate = sliderRate.value labelRate.text = String(format: "×%.1f",sliderRate.value) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. musicPlayer = AVAudioPlayer() musicPlayer.enableRate = true // MARK: STOPボタンを選択できないようにする stopButton.isEnabled = false } @IBAction func start(_ sender: Any) { do{ // 配列に入っている URL のうち、選択している曲の URL を渡す musicPlayer = try AVAudioPlayer(contentsOf: musicPaths[selectedMusic]) musicPlayer.enableRate = true } catch { print("エラー") } //numberOfLoopsに-1を指定すると無限ループする。 musicPlayer.numberOfLoops = -1 musicPlayer.play() // MARK: STARTボタンを選択された状態にする startButton.isSelected = true //startButton.backgroundColor = .red // MARK: STOP ボタンを選択できるようにする stopButton.isEnabled = true } @IBAction func stop(_ sender: Any) { musicPlayer.stop() // MARK: START ボタンの状態を戻す startButton.isSelected = false // MARK: STOP ボタンを選択できないようにする stopButton.isEnabled = false // ボタンを押下時にスライダーの値を0に戻す sliderRate.setValue(1, animated: true) } } // MARK: 押したボタンによって選択する曲を変える // 今回は曲を変更したら現在演奏している曲は停止させる} @IBAction func selectOne(_ sender: Any) { selectedMusic = 0 musicPlayer.stop() // ボタンを押下時にスライダーの値を0に戻す sliderRate.setValue(1, animated: true) // MARK: START ボタンの状態を戻す startButton.isSelected = false // MARK: STOP ボタンを選択できないようにする stopButton.isEnabled = false } } コード
コードは画像ではなく、テキストで貼ってください。その際、マークダウン機能を使ってもらえると助かります。
https://teratail.com/help/question-tips#questionTips3-5-1
ご指摘ありがとうございました。修正しました。
コードありがとうございます。とりあえず UIPageViewControllerDelegate の didFinishAnimating メソッドを実装して、その中で再生を止めれば良いのでは。
https://developer.apple.com/documentation/uikit/uipageviewcontrollerdelegate/1614090-pageviewcontroller
ご連絡遅くなりました。申し訳ありませんが、私の理解力不足で、
どこにコードを打ち込めば良いのかわかりません。
上述のサイトのDeclaration
optional func pageViewController(_ pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
〜〜
transitionCompleted completed: Bool)
を入力するのでよかったですか?AppDelegate に打ち込もうとしてもエラーが出てしまいます。
(Expected '{' in body of function declarationと'optional' can only be applied to protocol members Remove 'optional ')。
回答1件
あなたの回答
tips
プレビュー