iOS 系统音量的监听和设置

设置系统音量

主要要用到MPVolumeView这个类,需要导入MediaPlayer

  • 创建MPVolumeView,遍历其子view,获取其中的UISlider
  • 改变这个UISlider的值,便可以改变系统音量

改变系统音量的时候,屏幕上会显示音量提示框,如果不显示这个提示框,就要将MPVolumeView添加到当前的view上,主要代码如下:

    let volumeV = MPVolumeView(frame: CGRect(x: -3, y: -3, width: 1, height: 1))
    for view in volumeV.subviews{
        if view is UISlider{
            self.volumeSlider = (view as! UISlider)
        }
    }
    self.view.addSubview(volumeV)

监听系统音量

从上面可以得到控制音量的slider,只需要监听它值的改变(valueChange)便可以监听到系统音量的改变,但是在MPVolumeView被创建的时候,其中的slider的值还是为0,需要过一会时间系统才会给slider赋值(不止会赋值一次),此时会调用valueChange,但是并不意味这系统音量的改变。同理,如果想获取系统音量,还是要用到AVAudioSession.sharedInstance().outputVolume这个方法,直接读slider的值可能会读不准

当系统音量作出改变的时候,实际上会发出一条通知,我们只需要监听这个通知即可:

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.volumeChange(_:)) , name:Notification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification") , object: nil)

    @objc func volumeChange(_ notification:NSNotification) {
        let userInfo = notification.userInfo!
        let volume = userInfo["AVSystemController_AudioVolumeNotificationParameter"] as! Double
    }

这里需要注意,来到volumeChange这份方法的时候如果使用slider.valueAVAudioSession.sharedInstance().outputVolume获取音量,得到的还是旧值(它们需要过一会才会被设成新值)

一个简单的自定义音量控制demo

你可能感兴趣的:(iOS 系统音量的监听和设置)