MPVolumeView,避免显示“无可用音量”

3
我有一个包含 MPVolumeView 的项目。它已经设置好并且可以使用,唯一的问题是当我将设备静音时,文本"No Volume Available"出现在 MPVolumeView 上。我希望在设备静音时,MPVolumeView 的滑块被禁用。 volumeView 在视图 volumeBounds 中初始化,使用该视图的边界。
MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:volumeBounds.bounds] autorelease];
[volumeBounds addSubview:volumeView]; 
[volumeView sizeToFit];

谢谢 :)

如果您对帮助我完成其他事情感兴趣,请查看这个问题


如何改变设备的音量?唯一的方法是使用 MPVolumeView - Emil
1
从OS 3.0开始,您可以更改音量。请参见http://developer.apple.com/iphone/library/documentation/MediaPlayer/Reference/MPMusicPlayerController_ClassReference/Reference/Reference.html#//apple_ref/occ/instp/MPMusicPlayerController/volume - progrmr
那在 AVAudioPlayer 中行不通,对吧? - Emil
1
AVAudioPlayer还具有音量属性。您可以像Kenny建议的那样使用UISlider,并将其值发送到音量属性。因此,MPVolumeView不是控制音量的唯一方法。 - progrmr
我该如何使用MPVolumeView实现它?那就是我想要的。 - Emil
我的问题是,当设备静音时,如何避免显示文本“无可用音量”,我更希望有一种方法来禁用MPVolumeView的滑块。 - Emil
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 );

我似乎无法理解;看一下这段代码:AudioSessionAddPropertyListener(kAudioSessionProperty_CurrentHardwareOutputVolume, @selector(volumeChanged), self);。它会得到一个警告,说第二个参数是不兼容的指针类型。 - Emil
当我执行以下代码时:- (void) volumeChanged (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize, const void *inPropertyValue) { code },会出现错误提示:"Expected { before ( token"。这是怎么回事?所有关于AudioSession的东西对我来说都很新... - Emil
我需要在选择器现在的位置键入除volumeChanged之外的任何内容吗?我会试试看。 - Emil
在 .h 文件中:IBOutlet MPVolumeView *volumeView;@property (retain) MPVolumeView *volumeView;。 在 .m 文件中:@synthesize volumeView; - Emil
我不明白你的帖子在说什么,所以我没有接受它,如果你想知道的话。我该如何在这些 C 函数中使用 Objective-C 对象? - Emil
显示剩余3条评论

1
我最终选择这个简单的解决方案。
在Objective-C中:
[UILabel appearanceWhenContainedIn: [MPVolumeView class], nil].textColor = [UIColor clearColor];

在Swift中:

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

请参考以下答案中的appearanceWhenContainedWithin方法: 在Swift中出现时的外观 它只是隐藏了“无可用音量”文本,而不是用禁用的UISlider替换,以免担心MPVolumeView滑块和UISlider之间的对齐。
AVPlayer有一个volume属性,但其文档说:
使用此属性相对于其他音频输出控制播放器的音频音量。
AVAudioSession有只读的outputVolume属性,其文档说:
系统范围内的输出音量只能由用户直接设置;要在应用程序中提供音量控制,请使用MPVolumeView类。
对于限制,简单的解决方案(或解决方法)就是将文本颜色设置为透明。

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