做视频的时候,你很可能会遇到这么一个需求:视频全屏下,需要左半边屏幕上下调节屏幕亮度,右半边屏幕上下调节声音大小。网上有太多文章教你怎么使用MPVolumeView
这个类去获得系统音量调节画面,然后设置系统音量。
然鹅,如果我就是不想要系统音量调节画面呢,即使按下侧边的音量调节按钮,我都不想要显示系统自带画面呢?
好了,进入正题,说一下how to hide system volume change UI 。
进入全屏的时候
- 创建一个
MPVolumeView
单例,然后将其大小、透明度都往不可见设置。
为什么用单例,因为调节音量UI实例类本来就应该只有一个啊~~
+ (MPVolumeView *)shareSystemVolumeView
{
static MPVolumeView *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[MPVolumeView alloc] initWithFrame:CGRectZero];
instance.alpha = 0.0001f;
instance.userInteractionEnabled = NO;
instance.showsRouteButton = NO;
});
return instance;
}
- 最重要的来了,单例
MPVolumeView
必须在当前的视图层级中,否则无法隐藏 - 不过,苹果已经意识到系统音量调节画面会影响到观看的体验,iOS 11开始,播放状态下,只有音量调节的实际效果,没有提示画面。因此我们也没必要做这个隐藏处理了。
- 答案来源
监听系统音量的变化
系统的画面成功隐藏啦,那我该如何监听系统音量的变化,做出对应的UI处理呢?
答案来源
// 注册监听
[[AVAudioSession sharedInstance] addObserver:self forKeyPath:NSStringFromSelector(@selector(outputVolume)) options:NSKeyValueObservingOptionNew context:nil];
// 只要是系统音量发生了变化,都会触发,我们在这里UI变化
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (self.player.isFullScreen) {// 全屏下,才会使用自定的UI
if ([keyPath isEqualToString:NSStringFromSelector(@selector(outputVolume))]) {
if ([object isKindOfClass:[AVAudioSession class]]) {
AVAudioSession *audioSession = (AVAudioSession *)object;
float volume = audioSession.outputVolume;
// 显示自定义UI
[PYVolumeView changeVolumeWithNewVolume:volume];
}
}
}
}
这里备注一个之前遇到的bug:新创建的音频对象,默认的音量大小,根本就不是系统的音量大小。所以创建AVPlayer
对象的时候,要对其volume
属性进行设置:
avPlayer.volume = [AVAudioSession sharedInstance].outputVolume;
如何设置系统音量
除了手机侧边按键改变音量,如何在app内编码改变呢?这就如网上大量其他文章所说的,使用MPVolumeView。
+ (UISlider *)shareSystemVolumeViewSlider
{
static UISlider *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
for (UIView *view in [[PYVideoPlayerView shareSystemVolumeView] subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
instance = (UISlider*)view;
break;
}
}
});
return instance;
}
这里我们遍历之前创建的单例MPVolumeView
,找到它里面一个UISlider
实例,通过设置这个滑块的value
属性就可以改变系统音量了。
[[PYVideoPlayerView shareSystemVolumeViewSlider] setValue:volume animated:YES];
[[PYVideoPlayerView shareSystemVolumeViewSlider] sendActionsForControlEvents:UIControlEventTouchUpInside];
如果以后在遇到跟音量调节相关的问题,我会在这篇继续编辑哒!
(__) 嘻嘻……希望对你有帮助,over~~