19

我尝试了很多方法来实现常规UISlider和控制设备音量,但都是 Native-C 函数,导致许多无法追踪的错误。

我试过MPVolumeView它的魅力,它甚至可以在你关闭应用程序后控制设备音量,就像 iPod 应用程序一样。

我的问题是,有没有MPVolumeView用特定的颜色和图像来定制,就像UISlider

注意:我想要一种不使用私有未记录 API 的合法方法。

更新
根据@Alexsander Akers 的回答,由于子视图隐藏在MPVolumeView我必须循环浏览子视图,获取UISlider并自定义它,这里是代码。

IBOutlet UISlider *volumeSlider;   //defined in <class.h> and connected to a UISlider in Interface Builder

-(void) viewDidLoad {
     ....
     [self setCustomSlider];
     ....
}

-(void) setCustomSlider{
     MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:[volumeSlider frame]] autorelease];
     NSArray *tempArray = volumeView.subviews;

     for (id current in tempArray){
           if ([current isKindOfClass:[UISlider class]]){
                    UISlider *tempSlider = (UISlider *) current;
                    UIImage *img = [UIImage imageNamed:@"trackImage.png"];
                    img = [img stretchableImageWithLeftCapWidth:5.0 topCapHeight:0];
                    [tempSlider setMinimumTrackImage:img forState:UIControlStateNormal];

                    [tempSlider setThumbImage:[UIImage imageNamed:@"thumbImage.png"] forState:UIControlStateNormal];

           } 
    }
    [volumeSlider removeFromSuperview];
    [self.view addSubview:volumeView];
 }
4

5 回答 5

10

您可以尝试循环浏览其子视图并寻找 UISlider 子类?

于 2010-09-28T14:17:21.893 回答
8

iOS 5.0开始,您可以在UISlider上使用UIAppearance,即使是MPVolumeView的一部分。

代码库中的任何位置:

[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_full.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_empty.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setThumbImage:[UIImage imageNamed:@"nowplaying_player_nob.png"] forState:UIControlStateNormal];

这里列出了可以使用 UIAppearance 实现的其他一些类: https ://gist.github.com/mattt/5135521

于 2013-05-01T10:03:47.630 回答
3

现在有很多方法可以做到这一点,只需使用:

– setMaximumVolumeSliderImage:forState:
– setMinimumVolumeSliderImage:forState:
– setVolumeThumbImage:forState:

这与 vanilla 的方法名称略有不同UISlider

这可以防止您不得不循环浏览视图,并且可能在未来随着 Apple 的改变而出现问题。

于 2013-05-08T15:44:55.710 回答
1

用斯威夫特回答:

func customSlider() {
        let temp = mpVolView.subviews
        for current in temp {
            if current.isKind(of: UISlider.self) {
                let tempSlider = current as! UISlider
                tempSlider.minimumTrackTintColor = .yellow
                tempSlider.maximumTrackTintColor = .blue
            }
        }
    }

结果:

在此处输入图像描述

于 2017-11-21T15:54:34.787 回答
-1

尝试使用Notification,但看起来Apple 正在拒绝它们。


[编辑]

试试这个

于 2010-09-28T14:31:05.743 回答