据我所知,MPVolumeView 可以添加到我的应用程序以更改音量。但现在我想使用自定义滑块控制音量。如果 MPVolume 是 uislider 的子类,也许我可以自己适应它,事实上,它是 uiview 的子类。征求意见以实现我的想法,非常感谢。
6 回答
UIView *a=[[UIView alloc] init];
for (UIView *view in [volumeSlider subviews]) {
if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
a=view;
[(UISlider *)a setThumbImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];
[(UISlider *)a setMinimumTrackImage:[UIImage imageNamed:@"volume2.png"] forState:UIControlStateNormal];
[(UISlider *)a setMaximumTrackImage:[UIImage imageNamed:@"volume3.png"] forState:UIControlStateNormal];
}
}
那可以做我想做的,但我真的不知道它是否可以通过苹果的检查
如果您遍历 MPVolumeView 的视图层次结构并碰巧找到一个 UISlider,您总是可以自定义它。
for ( view in theVolumeView.subviews ) {
if ( [view isKindOfClass:[UISlider class]] ) { ... }
}
请注意,会有其他视图,并且可能没有 UISlider,所以不要做任何假设。您可能希望递归地遍历层次结构。
嗯,您可以制作自己的滑块,但它不会控制您想要的播放器的音量。您将不得不使用像 CoreAudio 和 CoreMedia 这样的低级框架。
为什么不继承 MPVolumeView?我从未尝试过对 MPVolumeView 进行子类化,但您可以通过子类化来访问 @protected 的东西,并通过添加一些类别来访问 @private 的东西。您可能想查看 MPVolumeView 的标题,看看是否有您可以自定义的 UISlider(或其他东西)。
更新:(2010/07/21)
我懂了。让我问你一件事。为什么需要将 UIProgressView 添加到 VolumeView?通常,您会将其添加到播放器播放中,但添加到其音量中,对吗?音量不像流式传输音频或视频那样加载,对吗?
其次,我只是看到了 MPVolumeView 的标题。它有一个私有的、隐藏的类,名为 MPVolumeViewInternal *_internal; 当您拥有此类类时,如果很难自定义而不被拒绝(将您的应用程序提交到 AppStore 时),您可以创建一个类别并访问 _internal var 但为了使用 _internal 您必须拥有其标题,这意味着使用不允许的私有标头和框架。
或者您可以查看Objective-C 运行时参考中的函数,并尝试使用 drawonward 建议的方法来查找要修改的对象的 UISlider。使用 Obj-C 运行时函数是大多数技巧或简单破解的方法;)
在界面生成器中创建一个 UIView 链接 MP 框架 在您的头文件中包含 MediaPlayer 标头,该标头对应于包含您刚刚创建的 UIView 的 XIB 将您刚刚创建的视图的类更改为 MPVolumeView
它不能在模拟器上运行,但它可以在设备上运行。
另一种选择是使用自定义滑块MPMusicPlayerController
:
MPMusicPlayerController *controller = [MPMusicPlayerController applicationMusicPlayer];
controller.volume = 0.5; // value in [0,1]
这是自定义音量滑块的完整代码。它已经过测试并适用于 xcode 4.6.1
MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:volumeSlider.bounds] autorelease];
UIView *a=[[UIView alloc] init];
for (UIView *view in [volumeView subviews]) {
if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) {
a=view;
[(UISlider *)a setThumbImage:[UIImage imageNamed:@"slider_thumb.png"] forState:UIControlStateNormal];
[(UISlider *)a setMinimumTrackImage:[UIImage imageNamed:@"slider_progress.png"] forState:UIControlStateNormal];
[(UISlider *)a setMaximumTrackImage:[UIImage imageNamed:@"slider_bg.png"] forState:UIControlStateNormal];
}
}
[volumeSlider addSubview:volumeView];
[volumeView sizeToFit];
您可以在顶部或头文件中声明图像名称,以便以后修改