有这样一个需求,在特定页面调节系统音量的时候需要隐藏系统的音量 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];
_originVolume = [AVAudioSession sharedInstance].outputVolume;
参考链接:
1、applicationMusicPlayer volume notification
2、MPVolumeView
3、iOS 编程修改系统音量