目錄
<h4 id="1">需求</h4>
最近在優(yōu)化項目中的播放器界面裸燎,設(shè)計師新出了一套UI,其中有一個音量的控制的 UISlider
。要求是访敌,在使用手機上的音量調(diào)節(jié)按鈕以及的時候,顯示音量調(diào)節(jié)的界面(系統(tǒng)自帶),在使用音量調(diào)節(jié)的slider
的時候轰枝,則不顯示音量調(diào)節(jié)的界面捅彻,因為本身已經(jīng)有了一個滑動條了,再加一個系統(tǒng)的略顯重復(fù)鞍陨。
<h4 id="2">總結(jié)</h4>
如果不想看下面啰哩啰嗦的代碼和對原理的猜測步淹,直接看結(jié)論在這里。??
-
將
MPVolumeView
添加到項目中的一個View
上并顯示在屏幕外后诚撵,改變音量就看不到了.[_mpVolumeView setFrame:CGRectMake(-100, -100, 40, 40)]; [_mpVolumeView setHidden:NO]; [self.view addSubview:_mpVolumeView];
-
使用下述2句代碼均可實現(xiàn)讓
MPVolumeView
重新可以顯示出來缭裆,區(qū)別是上面一句會在調(diào)用后顯示音量界面一次,請結(jié)合需求使用寿烟。[_mpVolumeView setHidden:YES]; [_mpVolumeView removeFromSuperview];
<h4 id="3">實現(xiàn)</h4>
實現(xiàn)上下滑動調(diào)節(jié)音量
-
使用
UIPanGestrueRecognizer
進行滑動手勢的識別幼驶。-(void)panGesture:(UIPanGestureRecognizer *)pan { CGPoint velocity = [pan velocityInView:pan.view]; CGFloat ratio = 13000.f; CGFloat nowVolumeValue = _mpVolumeSlider.value; float changeValue = (nowVolumeValue - velocity.y / ratio); }
-
拿到
MPVolumeView
和MPVolumeSlider
。_mpVolumeView = [[MPVolumeView alloc] init]; for (UIView *view in [_mpVolumeView subviews]) { if ([view.class.description isEqualToString:@"MPVolumeSlider"]) { _mpVolumeSlider = (UISlider *)view; break; } } [_mpVolumeView setFrame:CGRectMake(-100, -100, 40, 40)]; [_mpVolumeView setShowsVolumeSlider:YES]; }
-
MPVolumeView
如果不想看到韧衣,將frame
設(shè)置屏幕顯示范圍之外盅藻。 -
setShowsVolumeSlider
方法要設(shè)置為YES
,否則之后的設(shè)置會無效化畅铭。
-
-
在
panGesture
方法中將changeValue
賦值給_mpVolumeSilder
氏淑。[_mpVolumeSlider setValue:changeValue animated:YES]; [_mpVolumeSlider sendActionsForControlEvents:UIControlEventAllEvents];
在做完上述步驟后,已經(jīng)可以拖動調(diào)節(jié)音量了硕噩,并且可以看到系統(tǒng)音量調(diào)節(jié)界面假残。
實現(xiàn)拖動slider
調(diào)節(jié)音量
在界面上放一個
UISlider
。-
添加一個
valueChanged
的'target'炉擅。[_mpVolumeView setHidden:NO]; [self.view addSubview:_mpVolumeView]; [_mpVolumeSlider setValue:sender.value animated:NO];
- 系統(tǒng)的
MPVolumeView
的Hidden
設(shè)置為YES
會導(dǎo)致MPVolumeView
出現(xiàn)在你的屏幕中央辉懒。 - 想要隱藏音量設(shè)置界面,將
MPVolumeView
的hidden
設(shè)置為NO
谍失,并添加到自己的view
上眶俩,這樣會導(dǎo)致系統(tǒng)判斷你已經(jīng)將這個view添加到你的項目中的view
上,就不會在系統(tǒng)層面的window
上顯示MPVolumeView
了快鱼。做出這樣的假設(shè)是因為我在顯示出MPVolumeView
的時候看項目層級的時候是看不到MPVolumeView
的颠印。
- 系統(tǒng)的
-
但是現(xiàn)在有個問題,那就是使用音量調(diào)節(jié)按鈕和滑動調(diào)節(jié)的時候,也不顯示音量界面了抹竹。
- 給
slider
添加UIControlEventTouchUpInside
的target
线罕。在相應(yīng)事件中添加
[_mpVolumeView removeFromSuperview]; //將`_mpVolumeView`移除后,使用按鈕和滑動的時候窃判,系統(tǒng)判斷你沒有添加钞楼,然后就在系統(tǒng)`window`的層面上顯示了。
- 在
panGesture
中設(shè)置
[_mpVolumeView setHidden:YES]; //上述代碼同樣可以達到顯示音量調(diào)節(jié)界面的效果袄琳,在`target`中不用的原因是調(diào)用這句代碼的時候會顯示音量界面一次询件,與我們的需求不太符合燃乍。
- 給
<h4 id="4">Demo</h4>
Demo地址