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