MPVolumeView,避免显示“无可用卷”

时间:2010-05-13 18:21:36

标签: iphone objective-c device volume

我的项目中包含MPVolumeView。它已设置,并且有效,唯一的一点是,当我将设备静音时,文本"No Volume Available"会出现,而不是MPVolumeView。我希望在设备静音时禁用MPVolumeView的滑块。

在视图volumeBounds中初始化volumeView,并使用该视图的边界。

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:volumeBounds.bounds] autorelease];
[volumeBounds addSubview:volumeView]; 
[volumeView sizeToFit];

谢谢:)

如果您有兴趣帮助我做其他事情,请查看this question

2 个答案:

答案 0 :(得分:3)

使用AudioServices侦听硬件卷。当音量变为零时,将MPVolumeSlider的alpha设置为零,并将您自己的禁用UISlider置于相同位置。使滑块皮肤看起来像音量滑块。

AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume , ... );

kAudioSessionProperty_AudioRouteChanged也可能有用。

如果您在MPVolumeView下运行视图层次结构,您应该找到一个UISlider。如果没有,或者它是隐藏的,你知道静音字符串正在显示。

编辑:

This描述了监听器的函数原型。要将消息传递给类的实例,请执行以下操作:

void MyPropertyListener ( void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData );

void MyPropertyListener ( void *inClientData, AudioSessionPropertyID inID, UInt32 inDataSize, const void *inData ) {
  if ( inID == kAudioSessionProperty_CurrentHardwareOutputVolume ) {
    Float32 volume = *(Float32 *)inData;
    [(MyDelegateClass *)inClientData hardwareVolumeChanged:volume];
  }
}

AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume ,
  MyPropertyListener , aDelegateInstance );

答案 1 :(得分:1)

为了简单起见,我最终得到了这个解决方案。

在Objective-C中:

[UILabel appearanceWhenContainedIn: [MPVolumeView class], nil].textColor = [UIColor clearColor];

在斯威夫特:

UILabel.appearanceWhenContainedWithin([MPVolumeView.self]).textColor = UIColor.clearColor()

请参阅以下appearanceWhenContainedWithin方法的答案: appearanceWhenContainedIn in Swift

它只隐藏“No Volume Available”文本,而不是替换为禁用的UISlider而不用担心MPVolumeView滑块和UISlider之间的对齐。

AVPlayer具有volume属性,但其文档显示:

  

使用此属性控制播放器相对于其他音频输出的音量。

AVAudioSession具有只读outputVolume属性,其文档显示:

  

系统范围的输出量只能由用户直接设置;要在您的应用程序中提供音量控制,请使用MPVolumeView类。

对于限制,简单的解决方案(或解决方法)只是将文本颜色设置为清除。