[IOS] 監聽音量變化、監聽音量按鍵及隱藏系統音量UI

監聽音量變化

似乎並沒有一種正式的方式可以監聽並覆蓋掉系統音量按鈕的行爲。我們可以使用的是一個對系統音量變化的事件監聽。只需要按如下代碼添加上監聽即可。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章