3

据我所知,MPVolumeView 可以添加到我的应用程序以更改音量。但现在我想使用自定义滑块控制音量。如果 MPVolume 是 uislider 的子类,也许我可以自己适应它,事实上,它是 uiview 的子类。征求意见以实现我的想法,非常感谢。

4

6 回答 6

4
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];
    }

    }

那可以做我想做的,但我真的不知道它是否可以通过苹果的检查

于 2010-07-19T07:24:59.857 回答
3

如果您遍历 MPVolumeView 的视图层次结构并碰巧找到一个 UISlider,您总是可以自定义它。

for ( view in theVolumeView.subviews ) {
  if ( [view isKindOfClass:[UISlider class]] ) { ... }
}

请注意,会有其他视图,并且可能没有 UISlider,所以不要做任何假设。您可能希望递归地遍历层次结构。

于 2010-07-19T04:27:31.470 回答
2

嗯,您可以制作自己的滑块,但它不会控制您想要的播放器的音量。您将不得不使用像 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 运行时函数是大多数技巧或简单破解的方法;)

于 2010-07-19T04:19:38.923 回答
1

在界面生成器中创建一个 UIView 链接 MP 框架 在您的头文件中包含 MediaPlayer 标头,该标头对应于包含您刚刚创建的 UIView 的 XIB 将您刚刚创建的视图的类更改为 MPVolumeView

它不能在模拟器上运行,但它可以在设备上运行。

于 2011-12-22T16:06:50.107 回答
0

另一种选择是使用自定义滑块MPMusicPlayerController

MPMusicPlayerController *controller = [MPMusicPlayerController applicationMusicPlayer];
controller.volume = 0.5; // value in [0,1]
于 2012-10-17T21:12:06.060 回答
0

这是自定义音量滑块的完整代码。它已经过测试并适用于 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];

您可以在顶部或头文件中声明图像名称,以便以后修改

于 2013-04-11T10:24:35.997 回答