LoginSignup
9
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-27

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) 
9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12