1. 问题背景
类似Spotify或是AppleMusic,UI设计上有对应的音量调节进度条,以此为参考,我们需要实现实时监听系统物理按键的音量,并且音量进度条可以调节手机的系统音量
2. 解决方案
由于iOS15 之后AVSystemController_SystemVolumeDidChangeNotification通知不再回调,
所以我们通过MPVolumeView来获取
我们需要定义2个Slider,一个用于获取MPVolumeView的slider子视图,也用于控制系统音量
另一个Slider用来展示,以及接受控制事件.
-(UISlider *)VolumSilderForShow{
if(!_VolumSilderForShow){
_VolumSilderForShow = [[UISlider alloc]init];
[_VolumSilderForShow setThumbImage:[UIImage imageNamed:@"point"] forState:UIControlStateNormal];
_VolumSilderForShow.maximumTrackTintColor = [UIColor grayColor];
_VolumSilderForShow.minimumTrackTintColor = [UIColor whiteColor];
_VolumSilderForShow.maximumValue = 1;
_VolumSilderForShow.minimumValue = 0;
_VolumSilderForShow.value = [[AVAudioSession sharedInstance] outputVolume];
[_VolumSilderForShow addTarget:self action:@selector(sliderValueDidChanged:) forControlEvents:UIControlEventTouchUpInside];
[_VolumSilderForShow addTarget:self action:@selector(sliderValueDidChangedOutside:) forControlEvents:UIControlEventTouchUpOutside];
}
return _VolumSilderForShow;
}
-(void)sliderValueDidChanged:(HSSlider*)sender{
self.VolumSilder.value = sender.value;
}
-(void)sliderValueDidChangedOutside:(HSSlider*)sender{
self.VolumSilder.value = sender.value;
}
//MARK: - 手机音量变化
- (void)startListenForVolumeChanged {
// 获取系统音量
MPVolumeView *volumeView = [[MPVolumeView alloc] init];
for (UIView *view in [volumeView subviews]){
if ([view.class.description isEqualToString:@"MPVolumeSlider"]){
self.VolumSilder = (UISlider *)view;
break;
}
}
[self.VolumSilder addTarget:self action:@selector(silderVolumeChanged:) forControlEvents:UIControlEventValueChanged];
}
-(void)silderVolumeChanged:(UISlider *)slider{
float volume = slider.value;
float adjustVolume = (floorf(volume*100 + 0.5))/100;
[self.VolumSilderForShow setValue:adjustVolume];
}