iOS
Swift
playground
Swift3.0
Xcode8

【初心者向け】Swift3で爆速コーディングその5(サウンドとデリゲート)

More than 1 year has passed since last update.

Playgroundによるコーディングです。
初めての方は下記をご参考ください。

第1回:【初心者向け】Swift3で爆速コーディングその1(画面作成とSnippetsの使い方)
第2回:【初心者向け】Swift3で爆速コーディングその2(UIViewと文字表示)
第3回:【初心者向け】Swift3で爆速コーディングその3(ボタンクリックとイベント)
第4回:【初心者向け】Swift3で爆速コーディングその4(画像とアニメーション)

ソースコード

今回の全ソースコードです。

import UIKit
import AVFoundation

class ViewController: UIViewController,AVAudioPlayerDelegate {

    var audioPlayer : AVAudioPlayer!
    var button : UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()


        // 再生する音源のURLを生成
        let soundFilePath : String = Bundle.main.path(forResource: "sound", ofType: "mp3")!
        let fileURL : URL = URL(fileURLWithPath: soundFilePath)


        do{
            // AVAudioPlayerのインスタンス化
            audioPlayer = try AVAudioPlayer(contentsOf: fileURL)

            // AVAudioPlayerのデリゲートをセット
            audioPlayer.delegate = self


        }
        catch{
        }

        //ボタンの生成
        button = UIButton()
        button.frame = CGRect(x:0,y:0,width:100, height:30)
        button.setTitle("▶︎", for: UIControlState.normal)
        button.setTitleColor(UIColor.black, for: .normal)
        button.backgroundColor = UIColor.green
        button.layer.masksToBounds = true
        button.layer.cornerRadius = 10.0
        self.view.addSubview(button)
        button.addTarget(self, action: #selector(self.onClick(_:)), for: UIControlEvents.touchUpInside)

    }

    // ボタンがタップされた時に呼ばれるメソッド
    func onClick(_ sender: UIButton) {

        // playingプロパティがtrueであれば音源再生中
        if audioPlayer.isPlaying == true {

            // audioPlayerを一時停止
            audioPlayer.pause()
            sender.setTitle("▶︎", for: .normal)
        } else {

            // audioPlayerの再生
            audioPlayer.play()
            sender.setTitle("■", for: .normal)
        }
    }

    // 音楽再生が成功した時に呼ばれるメソッド
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        print("Music Finish")

        // 再度myButtonを"▶︎"に設定
        button.setTitle("▶︎", for: .normal)
    }

    // デコード中にエラーが起きた時に呼ばれるメソッド
    func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {
        print("Error")
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

let viewController = ViewController()
viewController.view.backgroundColor = UIColor.white


import PlaygroundSupport


PlaygroundPage.current.liveView = viewController
PlaygroundPage.current.needsIndefiniteExecution = true

プレビュー

再生ボタンを押したら、サウンドを再生します。

スクリーンショット 2016-09-27 22.00.50.png

デリゲート

delegateは処理を移譲する機能です。
概念的にはJavaとかのインタフェースに近いです。
delegateを継承したクラスはdelegateメソッドを実装する必要があります。(optionalのメソッドは実装任意です)
今回はAVAudioPlayerクラスのイベント処理をするためAVAudioPlayerDelegateを使います。

class ViewController: UIViewController,AVAudioPlayerDelegate {

ViewDidLoadでデリゲートをセットします。

// AVAudioPlayerのデリゲートをセット
audioPlayer.delegate = self

今回はaudioPlayerDidFinishPlayingメソッドとaudioPlayerDecodeErrorDidOccurメソッドを実装します。

// 音楽再生が成功した時に呼ばれるメソッド
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) 
// デコード中にエラーが起きた時に呼ばれるメソッド
func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) 

サウンド

サウンド周りのライブラリを利用するにはAVFoundationフレームワークをインポートします。

import AVFoundation

サウンドファイル(sound.mp3)を追加します。
適当なサウンドファイルを用意してください
追加の仕方は画像と同じなので第4回を参考にしてください

スクリーンショット 2016-09-27 22.12.05.png

サウンドファイルをロードします。

// 再生する音源のURLを生成
let soundFilePath : String = Bundle.main.path(forResource: "sound", ofType: "mp3")!
let fileURL : URL = URL(fileURLWithPath: soundFilePath)


do{
    // AVAudioPlayerのインスタンス化
    audioPlayer = try AVAudioPlayer(contentsOf: fileURL)            
    // AVAudioPlayerのデリゲートをセット
    audioPlayer.delegate = self            

}
catch{

}

ボタンが押されたらonClickメソッドが呼ばれ、
サウンドを再生します。再生中なら一時停止になります。
ボタンとコントロールのイベント処理に関しては第3回を参考にしてください

// playingプロパティがtrueであれば音源再生中
if audioPlayer.isPlaying == true {

   // audioPlayerを一時停止
   audioPlayer.pause()
   sender.setTitle("▶︎", for: .normal)

} else {

   // audioPlayerの再生
   audioPlayer.play()
   sender.setTitle("■", for: .normal)
}

再生が終わるとデリゲートのメソッドがコールバックされます。
デリゲートのメソッドはこのようにコールバックメソッドがほとんどです。

// 音楽再生が成功した時に呼ばれるメソッド
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)