iOS 中對音量的控制其實也有好多小竅門,這個小集幫你解惑。iOS 中主要有2個地方能夠控制音量,一個是系統音量,用戶主動按音量鍵調整音量,這種方式會顯示系統音量提示框;另外一個是播放器的音量,好比經過 AVAudioPlayer 調整音量,這種不會顯示系統提示音量框。
[1] 如何在調節音量時不顯示系統音量提示框
主要原理就是獲取系統音量 View,並把它讓用戶不可見。但注意一點,你不能把 MPVolumeView 的 hidden 屬性設置爲 YES,這樣致使的結果是用戶調整音量時任然會顯示系統音量提示框。 【圖一】
[2] 獲取系統音量
方法一:經過 self.volumeSlider 獲取
若是想獲取系統音量,能夠經過第一種方式中的 self.volumeSlider.value 來獲取,可是你發現第一次爲 0,這很糾結,這樣致使的結果就是獲取的系統音量不許確。這是由於初始 MPVolumeView 時,volumeSlider.value 尚未賦值,經過【圖2】能夠發現,音量是後來經過 [MPVolumeController updateVolumeValue] 來更新的。因此咱們能夠經過監聽 self.volumeSlide 值改變時的事件,達到獲取系統音量的目的。
[self.volumeSlider addTarget:self action:@selector(sliderValueDidChange:) forControlEvents:UIControlEventValueChanged];
方法二:經過 AVAudioSession 獲取
這種方法直接了當。
[[AVAudioSession sharedInstance] outputVolume];
[3] 自定義音量控件
若是想自定義音量控件,能夠監聽音量的變化,而且經過第一種方法隱藏系統音量提示框。經過監聽通知,達到監聽音量變化的效果。
[4] 監聽音量變化
監聽音量變化,經過監聽通知 AVSystemController_SystemVolumeDidChangeNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(volumeChanged:) name:@"AVSystemController_SystemVolumeDidChangeNotification" object:nil];
最終結果 AVSystemController_AudioVolumeNotificationParameter 表示音量的值,這裏須要注意的是 "AVSystemController_AudioVolumeChangeReasonNotificationParameter" = ExplicitVolumeChange; 這個值,它表示音量改變的緣由。須要注意的是有些狀況它並不會修改系統音量。它會因爲不一樣的場景,有不一樣的值。ExplicitVolumeChange 是用戶點擊音量按鈕,CategoryChange 是用戶按 home 鍵調起 Siri,RouteChange 這個是路線修改(不太清楚,什麼狀況下觸發的)。
AVSystemController_SystemVolumeDidChangeNotification; object = <AVSystemController: 0x1c4001dc0>; userInfo = {
"AVSystemController_AudioCategoryNotificationParameter" = "Audio/Video";
"AVSystemController_AudioVolumeChangeReasonNotificationParameter" = ExplicitVolumeChange;
"AVSystemController_AudioVolumeNotificationParameter" = "0.5625";
"AVSystemController_UserVolumeAboveEUVolumeLimitNotificationParameter" = 0;
}}
[5] 注意點
若是經過代碼修改了 self.volumeSlide 的 value,那麼會顯示出系統音量框,若是你發現某個頁面忽然蹦出一個系統音量框,緣由大多數是你修改了這個值。
更多知識小集的內容,請查看:網頁連接
git