3

我有一个项目MPVolumeView。它已设置,并且可以正常工作,唯一的是当我将设备静音时,文本"No Volume Available"出现而不是MPVolumeView. 我宁愿MPVolumeView在设备静音时禁用滑块。

volumeView 在 vi​​ew 中初始化volumeBounds,具有该视图的边界。

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

谢谢 :)

如果您有兴趣帮助我做其他事情,请查看此问题

4

2 回答 2

3

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

AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume , ... );

kAudioSessionProperty_AudioRouteChanged也可能有用。

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

编辑:

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

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 );
于 2010-05-22T04:49:49.073 回答
1

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

在 Objective-C 中:

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

在斯威夫特:

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

方法请参考以下答案appearanceWhenContainedWithinSwift中的appearanceWhenContainedIn

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

AVPlayervolume有财产,但它的文件说:

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

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

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

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

于 2015-03-03T08:18:18.067 回答