调节音量时隐藏系统提示框(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;



参考链接:

1、applicationMusicPlayer volume notification

2、MPVolumeView

3、iOS 编程修改系统音量


你可能感兴趣的:(iOS进阶)