在使用MPVolumeView滑块调整音量时隐藏设备音量HUD视图

我在iPad应用程序中使用MPMoviePlayer实现video播放器,使用MPVolumeView进行音量控制。 我的问题是,当我滚动音量视图来调整音量显示设备的音量叠加层如下面的截图。

在这里输入图像说明

我怎样才能禁用这个系统音量指示器HUD? 我的代码是:

@property (weak, nonatomic) IBOutlet MPVolumeView *playbackMPVolumeView; //Customizing controller - (void)customizeVolumeController { _playbackMPVolumeView.showsRouteButton = YES; _playbackMPVolumeView.showsVolumeSlider = YES; [_playbackMPVolumeView setVolumeThumbImage:[UIImage imageNamed:@"volume_slider_thumb.png"] forState:UIControlStateNormal]; } 

这是一个解决scheme

 CGRect frame = CGRectMake(-1000, -1000, 100, 100); MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:frame]; [volumeView sizeToFit]; [self.view addSubview:volumeView]; 

Swift 3

 let volumeView = MPVolumeView(frame: .zero) view.addSubview(volumeView) 
 - (void) viewDidLoad { [super viewDidLoad]; MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame: CGRectZero]; [self.view addSubview: volumeView]; ... } 

从applicationMusicPlayer卷通知中引用此参考

AppDelegate中:

 self.window?.insertSubview(MPVolumeView(), at: 0) 

只需将这些行添加到可以使MPVolumeView实例可见的位置即可。 例如:如果你有一个切换音量button

 -(void)toggle { self.volumeView.hidden = !self.volumeView.hidden; [self.volumeView willMoveToSuperview:self.volumeView.superview]; [self.volumeView didMoveToSuperview]; } 

万一你有一个总是可见的音量滑块(MPVolumeView的实例)。

 -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.volumeView.hidden = NO; [self.volumeView willMoveToSuperview:self.volumeView.superview]; [self.volumeView didMoveToSuperview]; } 

除了将MPVolumeView作为子视图添加外,下面的代码适用于我。

 AudioSessionInitialize(NULL, NULL, NULL, NULL); AudioSessionSetActive(YES); 

这对我有用。

 MPVolumeView *volumeView2 = [[MPVolumeView alloc] initWithFrame:CGRectMake(-28, -2, 24, 24)]; [self.view addSubview:volumeView2]; volumeView2.showsVolumeSlider = true; volumeView2.showsRouteButton = false; _videoPlayer.AllowsAirPlay = false; 

以上是Swift中的上述解决scheme。 适用于Swift 2-3。

 let frame = CGRect(x: -1000, y: -1000, width: 100, height: 100) let volumeView = MPVolumeView(frame: frame) volumeView.sizeToFit() self.view!.addSubview(volumeView) 

这是什么实际上为我工作,由于某种原因,如果CGRect是CGRect.zero,那么如果有一个button在左上angular将无法正常工作…,所以这一个工作:

 let volumeView = MPVolumeView(frame: CGRect.init(x: self.view.frame.maxX, y: self.view.frame.maxY, width: 0, height: 0)) volumeView.clipsToBounds = true volumeView.showsRouteButton = false self.view.addSubview(volumeView) 

我想出了Swift 4的最佳解决scheme

 import MediaPlayer 

添加这3行代码

  let volumeView = MPVolumeView(frame: .zero) volumeView.clipsToBounds = true view.addSubview(volumeView) 

我必须执行以下操作来禁用卷覆盖:

AppDeletage.m:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... // disable volume hud CGRect rect = CGRectMake(-500, -500, 0, 0); MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:rect]; [self.window addSubview:volumeView]; return YES; } 

AppDelegate.h:

 @interface AppDelegate : UIResponder <UIApplicationDelegate> ... @property (nonatomic, strong) MPVolumeView * volumeView; @end 

只有Objective C,没有Swift。 适用于iOS 8.1+(未经testing的早期版本)。 添加这个,因为我努力实现这个基于给定的答案没有上下文。