2016-10-01 27 views
0

音量変更のイベントではなく、ボタンの押下を検出する方法はありますか?私はこれらの2つのポスト次試してみましたが、彼らは体積変化はありませんボタンの押下を検出:スウィフト:音量を検出するボタン音量変更のイベントを表示しない

Cleanest way of capturing volume up/down button press on iOS8

swift detect volume button press

私はこれらの2つのイベントが使用できない理由は、私のアプリが自動的に特定のイベント中に音量を調整しているためであります。アプリケーションがこれを行うと、ユーザーが手動で音量ボタンを押したときと同じイベントではありません。

+0

なぜあなたはボタンが、具体的押されたときに知っておく必要がありますか? –

+0

これはアラームアプリケーションなので、アラームが発生すると、私のアプリはシステムボリュームを現在のレベルから最大レベルに変更します。このボリュームの変更はプログラム的なものであり、ユーザがボリュームボタンを押さなくても、以下のトリガが発生します:AVAudioSession.sharedInstance()。addObserver(self、forKeyPath: "outputVolume"、options:NSKeyValueObservingOptions.New、context:nil) – Pavel

+0

Makesアラームが消えた後にオブザーバーを取り外すほうが簡単でしょうか?それはあなたのコードで実行可能ではありませんか? –

答えて

3

私は、あなたがリンクした質問の中で通知を購読し、次にprogrammaticVolumeChangeという名前の変数を追加するとします。変数をプログラムで設定して変数をtrueに設定すると、関数observeValueForKeyPathに変数がtrueの場合、アラームはキャンセルされません(自然にfalseに設定されます)。ユーザーが音量ボタンを押すと、そのコードはあなたのコードではないことがわかります。おそらくプログラムのボリューム変更と関数呼び出しの間の時間をテストするかもしれませんが、うまくいくと思います。

例:

var programmaticVolumeChange = false 

func changeVolumeProgramatically() { 

    programmaticVolumeChange = true 
    //change volume programmatically after 

} 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, 
change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 

    if keyPath == "outputVolume"{ 

     if programmaticVolumeChange { 

      programmaticVolumeChange = false 

     } else { 

      //handle logic for user volume button press 

     } 

    } 

} 
+0

ありがとうございました!あなたのシンプルなロジックは時間の節約です。 – torap

関連する問題