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

17

我正在使用MPMoviePlayer实现iPad应用程序中的视频播放器,使用MPVolumeView控制音量。 我的问题是,当我滚动音量视图以调整音量时,它会显示设备的音量提示覆盖层,如下面的截图所示。

输入图像描述

我该如何禁用此系统音量指示符覆盖层? 我的代码是:

@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];
}

1
请查看此链接:https://dev59.com/uWsz5IYBdhLWcg3wfnwx - Suhail kalathil
实际上,我的音量滑块(在问题的截图中显示为“我的音量视图滑块”)是使用MPVolumeView创建的,代码中的outlet命名为playbackMPVolumeView。[MPMusicPlayerController applicationMusicPlayer](您在上面的评论中提到的链接中提到)不能用于设置音量,因为它已被弃用。因此,如果我将音量视图的框架设置为rectZero,则对我来说将没有滑块。 - Alex Andrews
iOS 16.4有没有解决方案?iPhone升级到16.4后停止工作了。 - Chaki_Black
14个回答

10

Swift 3

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

6

以下是解决方案

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

真棒的解决方案! - Genevios

6
如果您想在所有应用程序屏幕上隐藏HUD,请使用以下通用代码:
static let mpVolumeView = MPVolumeView()
static func setupHiddenMPVolume(_ view: UIView){
    if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
        mpVolumeView.alpha = 0.000001
        window.addSubview(mpVolumeView)
    }
}

如果您需要显示音量控制条,则可以从应用窗口中删除它。祝您使用愉快 :-)

2
至少对于我来说,这是正确的解决方案。上面那个在每个屏幕上隐藏音量视图的方法会导致应用程序性能下降,在来回切换视图15次后最终变得无响应。另一个解决方案中的MPVolumeView似乎必须以某种方式“释放”。 - avidD

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

我从applicationMusicPlayer音量通知中参考了以下内容:


4
我想到的最佳解决方案是 Swift 4
import MediaPlayer

添加这3行代码
    let volumeView = MPVolumeView(frame: .zero)
    volumeView.clipsToBounds = true
    view.addSubview(volumeView)

3

AppDelegate:

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

1

只需在您使MPVolumeView实例可见的位置添加这些行。例如:如果您有一个切换音量按钮

-(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];

}

0

以下的代码在我这里可以正常工作,除了添加MPVolumeView作为子视图。

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

0

这是我实际使用的方法,由于某种原因,如果CGRect为CGRect.zero,则如果在左上角有一个按钮,则无法正常工作...,因此这个方法有效:

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)

0
我必须执行以下操作来禁用音量叠加层:

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+(未测试早期版本)。我之所以添加这个说明是因为在没有上下文的情况下,根据给定的答案实现起来很困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接