设置系统音量
主要要用到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.value
或AVAudioSession.sharedInstance().outputVolume
获取音量,得到的还是旧值(它们需要过一会才会被设成新值)
网友评论