繁体   English   中英

UISlider setMaximumTrackTintColor

[英]UISlider setMaximumTrackTintColor

我正在尝试在UISlider上动态配置轨道颜色。

这行代码非常适合设置滑块轨道的低端。

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

当尝试对滑块轨道的高端执行相同的操作时,此代码行将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%。

奇怪的是,最小和最大对我来说都可以正常工作,我什至可以使它产生动画的颜色变化。 我所建议的就是重新创建滑块以及@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的屏幕上显示时,此滑块将没有最大轨迹,而不是白色轨迹。

这是一个Apple错误,在iOS 8中仍然存在。尝试通过子类上的代理设置器修改滑块的最大色调颜色时,我已经看到了它。 更改最小色调颜色可以很好地工作,并且不会显示任何错误,但是尝试更改最大色调颜色会引发大量的不良上下文错误,并且经常将滑块渐变的该部分绘制在错误的位置(这证明它确实没有良好的上下文) )。

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

对我来说,发生此问题是因为我将UISlider子类UISlider以创建自定义trackRectForBounds ,该自定义trackRectForBounds返回的CGRect大小无效。 我的原始实现(也许是某些iOS版本的实现?)返回的轨迹范围为0或负值,具体取决于UISlider的范围。 似乎与以下事实有关:设置minimum / maximumTrackTintColor将调用trackRectForBounds ,可能是为了创建轨道图像。

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

选项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:添加滑块并强制自动布局,以便在设置颜色之前正确调整其大小

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:修复覆盖,以确保无论边界如何,它都会返回非零大小的矩形。

- (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之后创建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];

编辑
抱歉,我在测试期间必须输入错误...但是我无法通过Interface Builder更改maximumTrackTintColor
如果要更改UISlider的maximumTrackTintColor,请使用上述方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM