5

如果您按下音量增大/减小硬件按钮,有没有办法防止显示音量指示器视图?

仅演示应用程序需要它。所以该方法不需要是 App Store 安全的。

4

3 回答 3

4

它是这样工作的:

  • 播放静音文件
  • 将卷视图添加到主视图
  • 将视图发送到后面

例如

 NSString *url = [[NSBundle mainBundle]
                       pathForResource:@"silent" ofType:@"mp3"];
 MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]
                       initWithContentURL:[NSURL URLWithString:url]];
 [moviePlayer play];

 MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:
                       CGRectMake(0, 0, 1, 1)] autorelease];
 [self.view addSubview:volumeView]; 
 [self.view sendSubviewToBack:volumeView];
于 2010-10-02T17:33:49.527 回答
2

IIRC,MPVolumeView 的存在抑制了音量指示器覆盖的显示。尝试坚持相关观点,看看是否是这种情况。

然后,您可以尝试各种技巧使其有效地隐形:

  • 将其隐藏(或隐藏超级视图)。
  • 将其 alpha(或 superview 的 alpha)设置为 0 或 0.01 左右。
  • 将其移出屏幕
  • 几乎将其移出屏幕(例如,只有左上角的像素在屏幕上)
  • 把它贴在另一个视图下。
  • 将其粘贴在带有 clipsToBounds=ON 的子视图中,并将其移出这些边界
  • 将 volumeView.layer.mask 设置为一个新的(因此是完全透明的)CALayer。设置 volumeView.userInteractionEnabled = NO。

所有这些在理论上都可以被 MPVolumeView 检测到,但我怀疑其中一些会起作用。

于 2010-10-02T12:56:54.953 回答
1
- (void)viewDidLoad
 {
  [super viewDidLoad];

  //get current volume level
  oldVolume= [[MPMusicPlayerController applicationMusicPlayer] volume];

  //hide volume indicator         
  MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:
                             CGRectMake(0, 0, 1, 1)] autorelease];

  musicController=[MPMusicPlayerController applicationMusicPlayer];
  [self.view addSubview:volumeView];
  [self.view sendSubviewToBack:volumeView];
  [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(volume) userInfo:nil repeats:YES];
}

- (void)volume
{
  if ([musicController volume]>oldVolume || [musicController volume]<oldVolume) {
    [musicController setVolume:oldVolume];
    // do some stuff here and the volume level never changes, just like volume action in camera app
   }
}
于 2013-02-12T06:58:40.290 回答