【问题标题】:Swift: Detect Volume Button Press NOT volume change eventsSwift:检测音量按钮按下不是音量变化事件
【发布时间】:2017-02-10 05:07:47
【问题描述】:

有没有办法专门检测按钮按下,而不是音量变化事件。我尝试关注这两个帖子,但它们检测到音量变化而不是按钮按下:

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

swift detect volume button press

我不能使用这两个事件的原因是因为我的应用会在某些事件期间自动调整音量。当应用执行此操作时,它与用户手动按下音量按钮时的事件不同。

【问题讨论】:

  • 为什么需要知道具体何时按下按钮?
  • 这是一个闹钟应用,所以当触发闹钟时,我的应用会将系统音量从当前级别更改为最大级别。此音量更改是程序化的,即使用户没有按下音量按钮,也会触发以下操作: AVAudioSession.sharedInstance().addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.New, context: nil)跨度>
  • 有道理,在警报响起后移除观察者会更容易吗?这在您的代码中不可行吗?
  • 我实际上希望观察者在警报响起(被触发)时处于活动状态,因为我希望音量按钮使警报静音。
  • 1.它可能使用一些相同的技术来检测音量按钮按下,通过检测音量变化事件。 2. 他们的代码可能会干扰我的代码,因为我们似乎都在访问和操作相同的共享全局实例:AVAudioSession.sharedInstance()... 3. 我看到它在 setSystemVolume 方法中使用了 MPMusicPlayerController,我认为它现在已被弃用。跨度>

标签: ios swift


【解决方案1】:

所以我要做的就是像他们在您链接的问题中那样订阅通知,然后添加一个名为 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

        }

    }

}

【讨论】:

  • Swift 5 在类代码中不起作用 + 在 vi​​ewDidLoad 中不起作用
  • 很好的解决方案。这适用于 Swift 5,尽管我使用了 NotificationCenter.default.addObserver(self, selector: #selector(volumeChanged(notification:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)(请参阅 OP 问题的链接答案以及更多详细信息)
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2011-08-29
  • 1970-01-01
相关资源
最近更新 更多