1. 程式人生 > >調節音量時隱藏系統提示框(Hide device volume HUD when adjust the volume)

調節音量時隱藏系統提示框(Hide device volume HUD when adjust the volume)

有這樣一個需求,在特定頁面調節系統音量的時候需要隱藏系統的音量 HUD 提示框。首先想到的是肯定是找控制系統音量的那個類,查詢一下有沒有對應的介面提供,過了一下 MPMusicPlayerController 並沒有找到我需要的介面。又 Google 了一下,找到了設定音量的類 MPVolumeView ,根據 stackoverflow 上的答案,說是這樣設定

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectZero];
[self.view addSubview: volumeView];
可以隱藏掉系統音量調節顯示框。測試了一下,發現隱藏不了。到後來才發現忽略了很重要的一點,上面的這段程式碼我是放在開始呼叫 startRecord 介面的時候才設定的,而 stackoverflow 上給出的答案是在 viewDidLoad 的時候去設定的,後來嘗試性的把上面這段程式碼放到 viewDidLoad 裡面執行,果然 OK !想了一下不是很明白,不管是呼叫 viewDidLoad 還是 startRecord 都是在主執行緒上執行,而且 startRecord 是在介面出現之後才去點選介面觸發的,還想著是否跟介面已經 load 完之前和之後有關係,又把測試程式碼放到了 viewWillAppear: 和 viewDidAppear: 函式,結果作用是跟 viewDidLoad 是一致的。說明跟介面載入前還是後沒有關係。那到底是什麼原因導致在長按按鈕 hide 系統音量提示框無效呢??想不明白。。。

同樣想不明白的是,既然是 MPVolumeView 類裡面的 MPVolumeSlider 來控制系統的音量提示框的,那麼我就直接拿到 MPVolumeSlider 將它的 hidden 屬性設定為 YES,按理來說應該也可以的,


做了如下測試,結果失敗了,沒能隱藏音量提示框。

MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectMake(-100, -100, 0, 0)];
    UISlider* volumeViewSlider = nil;
    for (UIView *view in [volumeView subviews]){
        if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
            volumeViewSlider = (UISlider*)view;
            volumeViewSlider.frame = CGRectMake(-1000, -100, 100, 100);
            volumeViewSlider.hidden = YES;
            break;
        }
    }

又加了一句,
[self.view sendSubviewToBack:volumeViewSlider];

發現還是失敗了,挺納悶的。

權且就先記錄一下吧,以後有想到什麼在回過頭來看看。

note: 必須的真機測試,模擬器測試沒有效果。

調節系統音量API:

[[MPMusicPlayerController applicationMusicPlayer] setVolume:volume];

獲取系統音量API:
_originVolume = [AVAudioSession sharedInstance].outputVolume;

參考連結: