使用MPVolumeView时隐藏灰色体积叠加?

can*_*boy 13 iphone objective-c ios mpvolumeview

我把MPVolumeView放在我正在播放的电影上.麻烦的是,每当我使用MPVolumeView调整音量时,就会出现标准的灰色音量叠加(当你在iPhone上使用摇臂开关时出现的那个).有没有办法禁用标准灰色叠加?

rav*_*ron 16

我可能有点晚了,但我想我有一些有用的东西可以添加.如果您只是在寻找答案,请跳至我如何解决?

什么是MPVolumeView
所述MPVolumeView类用于把滑块屏幕上控制该系统的体积.它应该防止系统音量叠加在屏幕上出现,但有时不会出现.当我将自己的MPVolumeView添加到视图层次结构时,我遇到了这个问题,但是当我拖动滑块时仍然看到叠加层出现.

怎么MPVolumeView知道什么时候可见?
这是我问自己的问题.不知何故,该类检测它是否可见,并告诉系统相应地隐藏或显示系统卷覆盖.这是因为Apple并不真的希望您使用该类只是为了防止叠加出现,而不实际向用户显示滑块UI(如在myell0w的答案中).

以下是我相信如何MPVolumeView检查它是否真的可见:

  1. 当视图添加到superview时,由viewWillMoveToSuperview:and 检测到viewDidMoveToSuperview,它启动一个短计时器.
  2. 当计时器触发时,视图通过递归检查superview属性来遍历其视图祖先树.
  3. MPVolumewView检查其每个祖先有hidden = NOalpha比一些小的值(可能是0.05)更大.

可能还有其他我不知道的检查,因为这段代码当然是封闭源代码.步骤1中的计时器就在那里,以便像下面这样的代码不会"欺骗"视图:

MPVolumeView *volView = [[MPVolumeView alloc] init];
[self.view addSubview:volView];
volView.hidden = YES;
Run Code Online (Sandbox Code Playgroud)

因为它会hidden立即检查属性,但在它已经设置之后会稍微检查一下YES.

我是怎么想出这一切的?一个关键的发现是MPVolumeView正在调用isHidden其superview 的实例,如下面的堆栈跟踪所示:

MPVolumeView堆栈跟踪

我的问题是什么?
简而言之,我做了这样的事情:

- (void)viewDidLoad {
    // Add an MPVolumeView to my view
    self.volView = [[MPVolumeView alloc] init];
    [self.view addSubview:self.volView];
    self.volView.hidden = YES;
}

- (void)someButtonTouched {
    // Show the MPVolumeView (and hopefully hide the system overlay)
    self.volView.hidden = NO;
}
Run Code Online (Sandbox Code Playgroud)

但是当我拖动新显示的滑块时MPVolumeView,叠加层仍然出现.我意识到这是因为在MPVolumeView实例化期间,它的超视图被隐藏了.

我是如何解决的?
一旦我意识到MPVolumeView班级如何判断它是否可见,我就有一种"愚弄"它的简单方法.我将以下方法添加到负责以下的类中MPVolumeView:

- (void)refreshVolumeView {
    [self.volView willMoveToSuperview:self];
    [self.volView didMoveToSuperview];
}
Run Code Online (Sandbox Code Playgroud)

每当我需要强制视图重新评估它是否可见时调用它.此方法只是假装将视图重新添加到层次结构中.一旦我满足视图评估的条件(每个祖先没有隐藏或非常低的alpha),我称之为,并且叠加停止显示.在上面的示例代码中,我将添加一行:

- (void)viewDidLoad {
    // Add an MPVolumeView to my view
    self.volView = [[MPVolumeView alloc] init];
    [self.view addSubview:self.volView];
    self.volView.hidden = YES;
}

- (void)someButtonTouched {
    // Show the MPVolumeView (and hopefully hide the system overlay)
    self.volView.hidden = NO;
    [self refreshVolumeView];  // <<< This line was added
}
Run Code Online (Sandbox Code Playgroud)


mye*_*l0w 7

通常,当MPVolumeView可见时,不会出现HUD.我在我的应用程序中使用以下方法,它工作正常:

+ (void)preventSystemVolumePopup {
    // Prevent Audio-Change Popus
    MPVolumeView *volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(-2000., -2000., 0.f, 0.f)];
    NSArray *windows = [UIApplication sharedApplication].windows;

    volumeView.alpha = 0.1f;
    volumeView.userInteractionEnabled = NO;

    if (windows.count > 0) {
       [[windows objectAtIndex:0] addSubview:volumeView];
    }
}
Run Code Online (Sandbox Code Playgroud)

它基本上只是在第一个窗口添加一个卷视图,在一个没有人可以看到它的位置,从而阻止系统卷HUD显示.我想知道为什么你看到这个HUD,即使你把一个音量视图放在电影上方.