我可以使用自定义滑块来控制音量吗?

时间:2010-07-19 03:40:07

标签: iphone ios ipad mpvolumeview

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

6 个答案:

答案 0 :(得分: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];
    }

    }

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

答案 1 :(得分:3)

如果您走过MPVolumeView的视图层次结构并碰巧找到UISlider,您可以随时自定义它。

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

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

答案 2 :(得分:2)

嗯,你可以制作自己的滑块,但它无法控制你想要的播放器的音量。您必须使用CoreAudio和CoreMedia等低级框架。

为什么不将MPVolumeView子类化?我从未尝试过子类化MPVolumeView 但是你可以通过添加一些类别来通过子类化和@private来访问@protected东西。您可能希望查看MPVolumeView的标题,以查看是否有可以自定义的UISlider(或其他内容)。

更新:(2010/07/21)

我明白了。让我问你一件事。为什么需要将UIProgressView添加到VolumeView?一般情况下,您会将其添加到播放器播放但是其音量对吗?音量或视频流加载不合适吗?

其次,我刚看到MPVolumeView的标题。它有一个名为MPVolumeViewInternal * _internal的私有隐藏类; 如果您有这类课程,如果很难自定义而不被拒绝(将应用程序提交到AppStore时) 您可以创建一个类别并访问_internal var,但为了使用_internal,您必须拥有其标题,这意味着使用不允许的私有标头和框架。

或者您可以查看Objective-C runtime Reference中的函数,并尝试像drawingonward建议的那样找到要修改的对象的UISlider。 使用Obj-C运行时函数是大多数技巧或易于破解的方法;)

答案 3 :(得分:1)

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

它无法在模拟器上运行,但它可以在设备上运行。

答案 4 :(得分:0)

另一个选项是使用MPMusicPlayerController自定义滑块:

MPMusicPlayerController *controller = [MPMusicPlayerController applicationMusicPlayer];
controller.volume = 0.5; // value in [0,1]

答案 5 :(得分: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];

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