iOS 11播放音乐库时修改音量如何隐藏音量HUD
如何修改MPMusicPlayerController音量时阻止系统HUD弹出
我明白你现在的困扰——用MPVolumeView的滑块调整音量时,系统自带的音量HUD总是弹出来,破坏体验对吧?其实问题出在你当前的实现是直接修改系统全局音量,而系统会自动触发这个HUD。下面给你两个适配不同场景的解决方案:
方案一:直接控制MPMusicPlayerController的音量(首推)
MPMusicPlayerController本身就提供了volume属性,专门用来控制它的播放音量,而且设置这个属性不会触发系统音量HUD,完全是应用内的独立音量控制逻辑,既简洁又安全。
修改你的代码很简单,直接给播放器实例设置音量即可:
let player = MPMusicPlayerController.applicationQueuePlayer player.shuffleMode = .off player.setQueue(with: MPMediaItemCollection(items: [mediaItem])) // 直接设置播放器音量,范围是0.0(静音)到1.0(最大) player.volume = 1.0 player.play()
这样你就不需要再折腾MPVolumeView和隐藏滑块了,一步到位解决问题。
方案二:如果需要控制系统全局音量(注意风险)
如果你确实需要修改系统全局音量又不想弹出HUD,那可以通过监听系统音量通知+隐藏MPVolumeView的方式拦截,但这个方法用到了私有通知名,在iOS新版本中可能失效,而且App Store审核时有被拒绝的风险,谨慎使用:
- 先注册系统音量变化的通知:
NotificationCenter.default.addObserver( self, selector: #selector(handleVolumeChange(_:)), name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil )
- 然后在通知处理方法中拦截HUD的显示:
@objc func handleVolumeChange(_ notification: Notification) { guard let userInfo = notification.userInfo else { return } let changeReason = userInfo["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String // 当是主动修改音量时,拦截系统HUD if changeReason == "ExplicitVolumeChange" { let currentVolume = AVAudioSession.sharedInstance().outputVolume // 同步隐藏滑块的音量值,避免系统再次触发HUD volView.volumeSlider?.setValue(currentVolume, animated: false) // 发送自定义通知覆盖系统的,阻止HUD弹出 NotificationCenter.default.post( name: NSNotification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil, userInfo: [ "AVSystemController_AudioVolumeNotificationParameter": currentVolume, "AVSystemController_AudioVolumeChangeReasonNotificationParameter": "SystemVolumeChangeReason_UserInteraction" ] ) } }
补充说明
你之前的方法之所以会弹出HUD,是因为通过MPVolumeView滑块修改的是系统全局音量,这是系统的默认反馈行为;而方案一中直接设置播放器的volume属性,是控制播放器自身的播放音量,和系统全局音量无关,所以不会触发HUD。
内容的提问来源于stack exchange,提问作者Carl Hung
相关产品推荐
相关产品推荐

