[英]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.
}
避免冗余设置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.