UISlider setMaximumTrackTintColor

我正在尝试在UISlider上dynamicconfiguration轨道颜色。

这行代码完美适用于设置滑块轨道的低端。

[self.sliderBar setMinimumTrackTintColor:[UIColor redColor]];

当试图对滑块轨道的高端做同样的事情时,这行代码会向debugging日志报告3个致命错误。

[self.sliderBar setMaximumTrackTintColor:[UIColor redColor]];

 <Error>: CGContextAddPath: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. <Error>: clip: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. <Error>: CGContextDrawLinearGradient: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update. 

我也尝试使用点符号来设置曲目色调的颜色,但也报告了相同的3个错误。

self.sliderBar.maximumTrackTintColor = [UIColor redColor];

我很困惑,为什么最小的轨道色彩设置正确,而最大的轨道色调是打破。 任何援助将不胜感激。

这个问题似乎与这个问题有关,但我不是100%确定,因为我没有使用graphics(只设置色调的颜色)。

奇怪的是,min和max都适合我,我甚至可以让它动起来变色。 我所能build议的是重新创build滑块和@synthesize。

 @synthesize slider; - (void)viewDidLoad { [super viewDidLoad]; [slider setMinimumTrackTintColor:[UIColor orangeColor]]; [slider setMaximumTrackTintColor:[UIColor blueColor]]; // Do any additional setup after loading the view, typically from a nib. } 

滑块与2种不同的颜色

避免设置maximumTrackTintColor冗余。 当我的代码更新颜色两次,最大的行将会消失。 我能够用一个简单的UISlider来重现它,就像这样:

  UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, 150, 23)]; slider.maximumTrackTintColor = [UIColor whiteColor]; slider.maximumTrackTintColor = [UIColor whiteColor]; 

在iOS 8屏幕上显示时,此滑块不会显示最大轨迹,而不是白色轨迹。

这是一个苹果的错误,它仍然存在于iOS 8中。我试图通过子类上的代理设置器修改滑块的最大色彩颜色时看到了它。 改变最小色调颜色工作正常,并没有显示错误,但试图改变最大色调颜色抛出不良的上下文错误吨,并经常绘制在错误的位置(这certificate它确实没有一个好的上下文)。

我找不到解决问题的办法,但会提交一个错误报告。

对我来说,问题发生是因为我已经分类UISlider创build一个自定义的trackRectForBounds ,返回一个无效大小的CGRect。 我的原始实现(也许是一些iOS版本的实现?)根据UISlider的界限返回了一个零或负大小的轨道边界。 它似乎与设置minimum / maximumTrackTintColor将调用trackRectForBounds的事实有关,可能为了创build一个轨道图像。

解决问题的方法是确保在设置最小/最大轨道色调颜色时,轨道边界将是有效的。

选项1:使用适合UISlider的initWithFrame

 UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0,0,100,38)]; slider.minimumTrackTintColor = [UIColor greenColor]; slider.maximumTrackTintColor = [UIColor orangeColor]; // ... rest of view setup ... 

选项2:添加滑块并强制自动布局,以便在设置色调颜色之前正确resize

 UISlider *slider = [[UISlider alloc] init]; // <-- problem, zero size [view addSubview:slider]; // ... other view setup, including constraints ... [view layoutIfNeeded]; // forced layout to give slider a non-zero size slider.minimumTrackTintColor = [UIColor greenColor]; slider.maximumTrackTintColor = [UIColor orangeColor]; 

选项3:修复覆盖,以确保它将返回一个非零大小的矩形,而不pipe边界。

 - (CGRect)trackRectForBounds:(CGRect)bounds { // example, inset left/right by 2 (thus width - 4) // track height is 5 pixels, centered in bounds. return CGRectMake( CGRectGetMinX(bounds) + 2, CGRectGetMinY(bounds) + (CGRectGetHeight(bounds) + 5)/2.0, MAX(10, CGRectGetWidth(bounds) - 4), // use max make sure positive. 5) } 

注意:我在viewDidLoad之后创build了UISliders,所以Ahufford的答案对我不起作用,但是我想这也可以解释它。 我也猜Ahufford的答案在大多数情况下可能效果最好。

我相信这是一个苹果问题。 有很多人用7.1报告了奇怪的UISlider行为。 我个人无法获得最低色彩的改变。 我认为在这一点上你无能为力。

IOS 8.3
这是用这些方法的作品

 [slider setMinimumTrackTintColor:[UIColor orangeColor]]; [slider setMaximumTrackTintColor:[UIColor blueColor]]; 

要么 :

 slider.minimumTrackTintColor = [UIColor orangeColor]; slider.maximumTrackTintColor = [UIColor blueColor]; 

编辑
对不起,我在testing过程中必须弄错…但是我不能通过Interface Builder更改maximumTrackTintColor ….
如果您想更改UISlider的maximumTrackTintColor,请使用上述方法