監(jiān)聽音量變化
似乎并沒有一種正式的方式可以監(jiān)聽并覆蓋掉系統(tǒng)音量按鈕的行為。我們可以使用的是一個對系統(tǒng)音量變化的事件監(jiān)聽。只需要按如下代碼添加上監(jiān)聽即可。
func someInit() {
NotificationCenter.default.addObserver(self, selector: #selector(onVolumnChanged),
name: Notification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
}
func onVolumnChanged(noti: Notification) {
// do your works
}
當(dāng)任何音量改變的事件發(fā)生時,這個監(jiān)聽都會被觸發(fā),據(jù)我測試的結(jié)果:
- 按下音量+-鍵
- 下拉打開控制面板,調(diào)節(jié)音量
- 前后攝鏡頭切換
還好,監(jiān)聽給的 Notification 對象里面提供了一些有用的參數(shù)幫我們區(qū)分出這些情況。可以使用
AVSystemController_AudioVolumeChangeReasonNotificationParameter
key來獲取音量改變的原因。代碼如下:
func onVolumnChanged(noti: Notification) {
let reason = (noti.userInfo?["AVSystemController_AudioVolumeChangeReasonNotificationParameter"] as? String) ?? ""
if reason == "ExplicitVolumeChange" {
// 明確的,用戶行為的音量改變,比如按下音量鍵和下拉控制面板調(diào)節(jié)音量
}
}
隱藏系統(tǒng)音量UI
另一個問題是當(dāng)按下音量按鍵時,UI 上會自動顯示出系統(tǒng)的音量條,有些業(yè)務(wù)需求需要隱藏,其實也很簡單,只需要在當(dāng)前的 viewController 里面的某個 view 中添加上 MPVolumeView ,然后把它的 frame 設(shè)置得屏幕外面,就行了。似乎系統(tǒng)會自動找到它,替換掉系統(tǒng)的音量條,這個只針對當(dāng)前這個 ViewController 有效。跳轉(zhuǎn)到下一個 ViewController,如果需要屏蔽,也需要獨立添加。
let mpVolumeView = MPVolumeView()
mpVolumeView.frame = CGRect(x: -500, y: -500, width: 10, height: 10)
addSubview(mpVolumeView)
如果以上內(nèi)容對你有所幫助,請在這些平臺上關(guān)注我吧,謝謝。o( ̄▽ ̄)d