我已经尝试了许多方法来实现常规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];
}
答案 0 :(得分:10)
您可以尝试在其子视图中循环并查找UISlider子类吗?
答案 1 :(得分: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
答案 2 :(得分:3)
现在有办法实现这一目标,只需使用:
– setMaximumVolumeSliderImage:forState:
– setMinimumVolumeSliderImage:forState:
– setVolumeThumbImage:forState:
与香草UISlider
的方法名称略有不同。
这可以防止你不得不循环浏览视图,并且可能会在Apple改变事物时将某些东西打破。
答案 3 :(得分:0)
Swift中的答案:
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
}
}
}
结果:
答案 4 :(得分:-1)