MILLEN BOX

音楽好きの組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

お手軽にクリック音付きボタンを作成する [swift2.0] [UIButton] [AudioServicesPlaySystemSound]

お久しぶりです。
無謀にも連打アプリをサブミットしました。
その仕上げの作業に忙しくなかなか更新出来なかったのです。
連打アプリについて気になった方は軽くこちらでご確認を。

▶︎ swiftでタイマー処理がしたい [swift1.2] - MILLEN BOX

▶︎ Game Center 4歩目(完結)。Leaders Boardでハイスコアの確認に対応する [swift1.2] [Game Center] - MILLEN BOX

▶︎ 連打アプリをコスリ対応するには? [swift1.2] [GestureRecognizer] - MILLEN BOX

今日はクリック音付きのボタンをお手軽に作成したいと思います。
Githubは以下です。

▶︎GitHub - anthrgrnwrld/clickSoundButton

また以下のページを参考にしました。

▶︎ Swiftでシステムサウンドを再生する - Qiita

▶︎ System Sound Services | Apple Developer Documentation

自分ポイント

実装方法としては以下の方針を立てました。

  • StoryboardでUIButtonを作成し、SourceのIBActionと紐付け
  • IBActionを実行時にサウンドを再生

再生するサウンドとしてはシステムに予め入ったものを再生します。 (だからお手軽です。)
再生方法としては、AudioServicesPlaySystemSound関数を使用することにしました。
一番簡単そうだったからです。AudioToolbox をimportを忘れないで下さい。
AudioToolbox をimportしておく必要があります。 また準備として、「SoundIDを自分で用意する」と決めた方が、私は理解し易かったです。
詳細は以下のソースコードを参照のこと。

mport UIKit
import AudioToolbox //忘れずに!!

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func pressButton(sender: AnyObject) {
        print("\(__FUNCTION__) is called.")
        AudioServicesPlaySystemSoundWithoutVibration("Tink.caf")    //システムサウンドを鳴らす関数
        
    }
    
    /**
    バイブレーション無しでシステムサウンドを再生する。
    http://iphonedevwiki.net/index.php/AudioServices 参照
    
    :param: soundName:再生したいシステムサウンドのファイル名
    */
    func AudioServicesPlaySystemSoundWithoutVibration(soundName :String) {
        
        var soundIdRing:SystemSoundID = 0       //SoundIDを格納する変数を作成
        let soundUrl = NSURL(fileURLWithPath: "/System/Library/Audio/UISounds/\(soundName)")    //システムサウンドのパスを指定
        AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing)    //再生に使用するSoundIDを作成
        AudioServicesPlaySystemSound(soundIdRing)   //音を再生する
        
    }

}

再生可能なシステムサウンドとその名前については以下のページを参考にしました。

▶︎ iOSのシステムサウンドを確認する | Developers.IO

自分ポイント(注意点)

理由については正確には調べていませんが、シミュレーターでは音の再生を確認することができないようです。
実機での確認をお願いいたします。(Xcode7からは無料で実機テストできるようになったしね。)
また音声は現在のシステムオーディオボリュームで再生され、プログラムでのボリューム制御はできません。

おそらくもっと便利で気の利いたやり方があるのでしょうが、現状のスキルとやりたいことではAudioServicesPlaySystemSoundを使用するのは良い方法でした。