UISlider的thumbTintColor在iOS 7上没有改变(在iOS 6上很好)。

14

我有一个在iOS 6上运行完美的应用程序。我已经这样设置了UISlider的滑块闪烁效果:

-(void)startBlinkingSlider{
    isSliderBlinking = YES;
    isSliderTinted = NO;
    [self performSelector:@selector(toggleSliderColor) withObject:nil afterDelay:0.2];
}

-(void)toggleSliderColor{
    if(isSliderBlinking){
        if(isSliderTinted){
            self.effectAmountSlider.thumbTintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
        }else{
            self.effectAmountSlider.thumbTintColor = [UIColor colorWithRed:255 green:0 blue:0 alpha:1];
        }
        isSliderTinted = !isSliderTinted;
        [self performSelector:@selector(toggleSliderColor) withObject:nil afterDelay:0.2];
    }
}

-(void)stopBlinkingSlider{
    isSliderBlinking = NO;
    isSliderTinted = NO;
    self.effectAmountSlider.thumbTintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1];
}

当我调用startBlinkingSlider函数时,我的iOS 6中的滑块开始闪烁为红色。但是,如果我在我的iOS 7设备上运行完全相同的应用程序,则什么也不会发生。滑块的拇指保留其原始白色。我在设置thumbTintColor的那一行上设置了断点。在调试器中,这是我得到的:

(lldb) po self.effectAmountSlider.thumbTintColor
error: failed to get API lock
(lldb) po self.effectAmountSlider.thumbTintColor
UIDeviceRGBColorSpace 0 0 0 1
(lldb) 

我输入了完全相同的代码,但在第一个中得到了奇怪的信息。然而,第二个结果是正确的。然后在将其设置为红色后,我也获得了正确的结果:

(lldb) po self.effectAmountSlider.thumbTintColor
UIDeviceRGBColorSpace 1 0 0 1
即使调试器显示了正确的值,但是滑块没有任何视觉变化。它仍然是白色的,颜色没有改变。我在这里搜索了苹果的文档:https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Controls.html。其中并未说明UISlider的thumbTintColor不适用于iOS 6。它应该按预期工作。我已经检查了线程,一切都在主线程上运行。toggleSliderColor始终在主线程上运行,因此不是线程问题。为什么我的拇指颜色不起作用呢?谢谢,Can.

1
这对我来说感觉像是一个 bug。我只是尝试在创建 UISlider 时设置它的 tint color,比你用闪烁做的要简单得多,但当我运行它时,它总是变成白色。我很想知道这是否是一个已确认的 bug,或者我们做错了什么。 - GeneralMike
@GeneralMike如果您输入了一个错误,请发布它,查看我下面的答案,我们可以将我们的复制到您的。 - David H
@DavidH:我还没有提交错误报告,我只是猜测这可能是一个错误。你在回答中提到的iOS 7 UI Transition Guide的信息似乎表明这里有些问题。我已经被暂时调到另一个项目,但等我回来后,我会提交一个错误报告并复制你的。 - GeneralMike
你应该考虑切换答案到aaronsti的,因为他给出了一个真正解决问题的方法。我对此没有任何问题! - David H
@DavidH 你说得对,我已经改过来了。 - Can Poyrazoğlu
4个回答

19

我发现了一个解决方法。先调用“setThumbImage:forState:”方法,然后“thumbTintColor”属性就会生效。

[self.slider setThumbImage:[UIImage imageNamed:@"Thumb.png"] 
                  forState:UIControlStateNormal];
self.slider.thumbTintColor = [UIColor blackColor];

我在iOS模拟器的版本7.0 (463.9.4.2)上进行了测试。


我目前无法测试它(该项目当前处于无法编译的状态),但是在我的项目中是否需要Thumb.png作为资产可用,或者如果未指定,它是否默认为它? - Can Poyrazoğlu
是的,必须将Thumb.png添加到Images.xcassets中。如果在资源中找不到Thumb.png,则会编译,但解决方法将无法正常工作,滑块的拇指仍将显示为白色。它不一定要命名为Thumb.png,可以使用任何您想要的图像名称。 - aaronsti

11

今天早上我碰巧又读了一遍iOS 7 UI Transition Guide,在Slider下面看到了一条声明。如果maximumTrackTineColorthumbTintColor中有任何一个是nil,则两个属性都会被忽略。所以我尝试设置所有的着色,但滑块还是白色。

我提交了一个错误报告-编号为#15277127-如果你也遇到这个问题可以参考这个编号进行报告。报告越多,苹果公司就越有可能很快修复此问题。

编辑:苹果公司已将我的错误报告合并到另一个错误上,显然这个问题早已知晓。


是的,这似乎真的是一个 bug。我也已经提交了一个 bug 报告。(但在报告中除了我的之外,我看不到其他的 bug,所以我不知道该如何引用) - Can Poyrazoğlu
@canpoyrazoğlu,请发布您的错误编号,我会将我的复制到您的上面。 - David H
15199234。但是你如何看待别人的bug? - Can Poyrazoğlu
2
@canpoyrazoğlu 你看不到其他的错误,但你可以在你的错误报告中添加新信息,比如说“相关错误”或“将此错误复制到<编号>”。这样做对于苹果来说更加高效,因为他们不必自己去寻找重复的错误,而且重复错误的数量越多,苹果修复该错误的可能性就越大。 - David H
确认,在iOS 7.1.2和Xcode 6.1中,我的iPad Air上未显示UISlider。在Interface Builder中,Thumb Tint设置为默认(透明),当我手动将其设置为白色时,拇指出现了。Min/Max Track Tint始终为浅灰色。因此,这个错误已经存在一年多了,苹果还没有解决它。 - Zack Morris
@ZackMorris 我有数百个待处理的bug - 这些问题可能永远无法得到解决。看起来有一个解决方法,但我自己没有尝试过(可以看看aaronsti的回答)。 - David H

10
基于 @aaronsti 的答案,我发现以下方法适用于我。将 thumb-image 设置为 nil 没有任何效果。
  [_slider setThumbImage:[_slider thumbImageForState:UIControlStateNormal] forState:UIControlStateNormal];
_slider.minimumTrackTintColor = minTintColor;
_slider.thumbTintColor = thumbTintColor;

2
第一行改变了某些东西,但是在thumbImage上没有得到正确的UIColor,而是一个带有渐变的颜色,每次我移动UISlider时它都会更改为正确的颜色,直到我不选择它为止。 - Alex Cio

2
到目前为止,在Xcode 6.2和iOS 8.2中,这个问题仍然存在,而解决方法仍然有效。Swift版本:
slider.setThumbImage(slider.thumbImageForState(.Normal), forState:.Normal)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接