UISlider thumbTintColor不会在iOS 7改变(在iOS 6罚款)

问题描述:

我有一个完美的运行在iOS 6,我给自己定一个闪烁效果到UISlider的拇指这样的应用程序:UISlider thumbTintColor不会在iOS 7改变(在iOS 6罚款)

-(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总是在主线程中,所以它不是线程问题。为什么我的拇指颜色不起作用?

谢谢你,可以。

+1

这对我来说就像是一个bug。我只是在创建UISlider时为它设置色调,比你在闪烁时做的要简单得多,但是当我运行它时它会一直呈现白色。我会急于听到这是一个确认的错误还是我们做错了什么。 – GeneralMike

+0

@GeneralMike如果你输入了一个错误,请将其发布,看到我的答案在下面,我们得到我们的重复你的。 –

+0

@DavidH:我还没有提交错误报告,我只是猜测它是一个错误。您在答案中引用的“iOS 7 UI过渡指南”中的信息似乎表明这里有些可疑的事情发生。我已经暂时搬到一个不同的项目,但是当我回到这个时候,我会提交一个错误报告并重复你的。 – GeneralMike

在@ aaronsti的答案的基础上,我发现下面为我工作。将拇指图像设置为nil没有效果。

[_slider setThumbImage:[_slider thumbImageForState:UIControlStateNormal] forState:UIControlStateNormal]; 
_slider.minimumTrackTintColor = minTintColor; 
_slider.thumbTintColor = thumbTintColor; 
+2

第一行改变了一些东西,但不是在'thumbImage'上得到正确的'UIColor'我有一个带有渐变的颜色,每次移动'UISlider'它都会改变为正确的颜色,直到我不选择它.. –

我刚好碰巧在今天早上再次读了iOS 7 UI Transition Guide,并且在Slider的声明中绊倒了。如果其中任一个maximumTrackTineColorthumbTintColor都是零,则两个属性都被忽略。所以我试图设置所有的色调,拇指仍然是白色。

我进入这个bug报告 - #15277127 - 参考,如果你输入自己的错误。问题越多,苹果公司很快就会修复它。

编辑:苹果欺骗了我的错误,以一个又一个 - 这显然是知道前一阵子。

+0

是的,这真的是一个错误。我也输入了错误报告。 (我不能看到除我以外的任何错误,虽然在错误记者,所以我不知道如何参考) –

+0

@canpoyrazoğlu发布您的错误号码,我会重复我的你的 –

+0

15199234.但你怎么看别人的错误? –

我发现了一个解决方法。通过首先调用'setThumbImage:forState:'方法,'thumbTintColor'属性将生效。

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

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

+0

我目前无法测试它(该项目目前处于不可编译的状态),但是需要Thumb.png作为我的项目中的资产吗?还是默认它,如果未指定? –

+0

是的,Thumb.png必须添加到Images.xcassets。如果在资产中找不到Thumb.png,它将进行编译,但解决方法不起作用,并且滑块的大拇指仍将显示为白色。没有必要命名为Thumb.png,但是您需要任何图像名称。 – aaronsti

到目前为止,在Xcode 6.2,iOS 8.2中,问题仍然存在,解决方法仍然有效。 Swift版本:

slider.setThumbImage(slider.thumbImageForState(.Normal), forState:.Normal)