設(shè)置系統(tǒng)音量
主要要用到MPVolumeView這個(gè)類,需要導(dǎo)入MediaPlayer
- 創(chuàng)建MPVolumeView母谎,遍歷其子view,獲取其中的UISlider
- 改變這個(gè)UISlider的值京革,便可以改變系統(tǒng)音量
改變系統(tǒng)音量的時(shí)候奇唤,屏幕上會(huì)顯示音量提示框幸斥,如果不顯示這個(gè)提示框,就要將MPVolumeView添加到當(dāng)前的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)
監(jiān)聽系統(tǒng)音量
從上面可以得到控制音量的slider,只需要監(jiān)聽它值的改變(valueChange)便可以監(jiān)聽到系統(tǒng)音量的改變甲葬,但是在MPVolumeView被創(chuàng)建的時(shí)候,其中的slider的值還是為0懈贺,需要過一會(huì)時(shí)間系統(tǒng)才會(huì)給slider賦值(不止會(huì)賦值一次)经窖,此時(shí)會(huì)調(diào)用valueChange,但是并不意味這系統(tǒng)音量的改變梭灿。同理画侣,如果想獲取系統(tǒng)音量,還是要用到AVAudioSession.sharedInstance().outputVolume
這個(gè)方法堡妒,直接讀slider的值可能會(huì)讀不準(zhǔn)
當(dāng)系統(tǒng)音量作出改變的時(shí)候配乱,實(shí)際上會(huì)發(fā)出一條通知,我們只需要監(jiān)聽這個(gè)通知即可:
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
}
這里需要注意皮迟,來(lái)到volumeChange這份方法的時(shí)候如果使用slider.value
或AVAudioSession.sharedInstance().outputVolume
獲取音量搬泥,得到的還是舊值(它們需要過一會(huì)才會(huì)被設(shè)成新值)