美文网首页iOS开发知识小集
iOS 系统音量的监听和设置

iOS 系统音量的监听和设置

作者: 某某香肠 | 来源:发表于2019-02-24 14:47 被阅读3次

    设置系统音量

    主要要用到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 系统音量的监听和设置

        本文链接:https://www.haomeiwen.com/subject/kntbyqtx.html