2016-10-01 3 views
0

Gibt es eine Möglichkeit, die Tasten drücken, nicht die Lautstärke ändern Ereignisse. Ich habe versucht, diese beiden Beiträge folgen, aber sie erkennen nicht Taste drückt Volumenänderung:Swift: Detect Volume-Taste Drücken Sie NOT Lautstärke ändern Ereignisse

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

swift detect volume button press

Der Grund, warum ich nicht diese beiden Ereignisse verwenden können, liegt daran, dass meine App automatisch die Lautstärke während bestimmter Ereignisse einstellt . Wenn die App dies tut, ist es nicht dasselbe Ereignis wie wenn der Benutzer die Lautstärketasten manuell drückt.

+0

Warum müssen Sie wissen, wenn die Taste gedrückt wird speziell? –

+0

Es handelt sich um eine Alarm-App. Wenn ein Alarm ausgelöst wird, ändert meine App die Systemlautstärke von ihrem aktuellen Wert auf den maximalen Wert. Diese Volumenänderungen sind programmatisch und lösen das Folgende aus, obwohl der Benutzer die Lautstärketasten NICHT gedrückt hat: AVAudioSession.sharedInstance(). AddObserver (self, für KeyPath: "outputVolume", Optionen: NSKeyValueObservingOptions.New, context: nil) – Pavel

+0

Makes Sinn, wäre es einfacher, den Beobachter nach dem Alarm einfach zu entfernen? Ist das in Ihrem Code nicht möglich? –

Antwort

3

Also, was ich tun würde ist, abonnieren Sie die Benachrichtigung wie sie in den Fragen, die Sie verknüpft haben, und fügen Sie dann eine Variable namens say programmaticVolumeChange. Wenn Sie die Lautstärke programmgesteuert ändern, legen Sie die Variable auf true fest, und in Ihrer Funktion observeValueForKeyPath, wenn die Variable wahr ist, brechen Sie den Alarm nicht ab (und setzen ihn natürlich auf false). Auf diese Weise, wenn der Benutzer die Lautstärketasten drückt, wissen Sie, dass es nicht Ihr Code ist. Vielleicht teste ich die Zeit zwischen einer programmatischen Lautstärkeänderung und dem Funktionsaufruf, aber ich denke, das wäre in Ordnung.

Eg

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

Vielen Dank!Ihre einfache Logik spart Zeit. – torap

Verwandte Themen