做視頻的時(shí)候,你很可能會(huì)遇到這么一個(gè)需求:視頻全屏下,需要左半邊屏幕上下調(diào)節(jié)屏幕亮度,右半邊屏幕上下調(diào)節(jié)聲音大小。網(wǎng)上有太多文章教你怎么使用MPVolumeView這個(gè)類去獲得系統(tǒng)音量調(diào)節(jié)畫面,然后設(shè)置系統(tǒng)音量。
然鵝,如果我就是不想要系統(tǒng)音量調(diào)節(jié)畫面呢,即使按下側(cè)邊的音量調(diào)節(jié)按鈕,我都不想要顯示系統(tǒng)自帶畫面呢?
好了,進(jìn)入正題,說(shuō)一下how to hide system volume change UI 。
進(jìn)入全屏的時(shí)候
- 創(chuàng)建一個(gè)
MPVolumeView單例,然后將其大小、透明度都往不可見設(shè)置。
為什么用單例,因?yàn)檎{(diào)節(jié)音量UI實(shí)例類本來(lái)就應(yīng)該只有一個(gè)啊~~
+ (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;
}
- 最重要的來(lái)了,單例
MPVolumeView必須在當(dāng)前的視圖層級(jí)中,否則無(wú)法隱藏 - 不過(guò),蘋果已經(jīng)意識(shí)到系統(tǒng)音量調(diào)節(jié)畫面會(huì)影響到觀看的體驗(yàn),iOS 11開始,播放狀態(tài)下,只有音量調(diào)節(jié)的實(shí)際效果,沒(méi)有提示畫面。因此我們也沒(méi)必要做這個(gè)隱藏處理了。
- 答案來(lái)源
監(jiān)聽系統(tǒng)音量的變化
系統(tǒng)的畫面成功隱藏啦,那我該如何監(jiān)聽系統(tǒng)音量的變化,做出對(duì)應(yīng)的UI處理呢?
答案來(lái)源
// 注冊(cè)監(jiān)聽
[[AVAudioSession sharedInstance] addObserver:self forKeyPath:NSStringFromSelector(@selector(outputVolume)) options:NSKeyValueObservingOptionNew context:nil];
// 只要是系統(tǒng)音量發(fā)生了變化,都會(huì)觸發(fā),我們?cè)谶@里UI變化
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
if (self.player.isFullScreen) {// 全屏下,才會(huì)使用自定的UI
if ([keyPath isEqualToString:NSStringFromSelector(@selector(outputVolume))]) {
if ([object isKindOfClass:[AVAudioSession class]]) {
AVAudioSession *audioSession = (AVAudioSession *)object;
float volume = audioSession.outputVolume;
// 顯示自定義UI
[PYVolumeView changeVolumeWithNewVolume:volume];
}
}
}
}
這里備注一個(gè)之前遇到的bug:新創(chuàng)建的音頻對(duì)象,默認(rèn)的音量大小,根本就不是系統(tǒng)的音量大小。所以創(chuàng)建AVPlayer對(duì)象的時(shí)候,要對(duì)其volume屬性進(jìn)行設(shè)置:
avPlayer.volume = [AVAudioSession sharedInstance].outputVolume;
如何設(shè)置系統(tǒng)音量
除了手機(jī)側(cè)邊按鍵改變音量,如何在app內(nèi)編碼改變呢?這就如網(wǎng)上大量其他文章所說(shuō)的,使用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;
}
這里我們遍歷之前創(chuàng)建的單例MPVolumeView,找到它里面一個(gè)UISlider實(shí)例,通過(guò)設(shè)置這個(gè)滑塊的value屬性就可以改變系統(tǒng)音量了。
[[PYVideoPlayerView shareSystemVolumeViewSlider] setValue:volume animated:YES];
[[PYVideoPlayerView shareSystemVolumeViewSlider] sendActionsForControlEvents:UIControlEventTouchUpInside];
如果以后在遇到跟音量調(diào)節(jié)相關(guān)的問(wèn)題,我會(huì)在這篇繼續(xù)編輯噠!
(__) 嘻嘻……希望對(duì)你有幫助,over~~