UISlider thumbTintColor не изменяется на iOS 7 (отлично на iOS 6)
У меня есть приложение, которое отлично работает на 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
Несмотря на то, что отладчик показывает правильное значение, я не вижу визуальных изменений в слайдере. Он по-прежнему белый, цвет никоим образом не меняется. Я искал документы Apple здесь: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/Controls.html
Он ничего не говорит о том, что UISlider thumbTintColor не работает как iOS 6. Он должен оставаться работоспособным, как ожидалось. Я проверил поток, и все работает на основном потоке. toggleSliderColor
всегда находится в основном потоке, так что это не проблема с потоками. Почему мой цвет большого пальца не работает?
Спасибо, может.
Ответы
Ответ 1
На основании ответа @aaronsti я обнаружил, что для меня это работало. Настройка большого пальца-изображения на nil
не имела эффекта.
[_slider setThumbImage:[_slider thumbImageForState:UIControlStateNormal] forState:UIControlStateNormal];
_slider.minimumTrackTintColor = minTintColor;
_slider.thumbTintColor = thumbTintColor;
Ответ 2
Я обнаружил обходное решение. Сначала вызов метод setThumbImage: forState:, свойство "thumbTintColor" вступит в силу.
[self.slider setThumbImage:[UIImage imageNamed:@"Thumb.png"]
forState:UIControlStateNormal];
self.slider.thumbTintColor = [UIColor blackColor];
Я тестировал это на версии 7.0 (463.9.4.2) симулятора iOS.
Ответ 3
Я просто так утром прочитал iOS 7 UI Transition Guide
снова этим утром и споткнулся о заявлении в Slider
. Если EITHER maximumTrackTineColor
OR thumbTintColor
равно nil, то оба свойства игнорируются. Поэтому я попытался установить все цвета оттенков, большой палец еще белый.
Введено сообщение об ошибке - # 15277127 - укажите его, если вы введете свой собственный баг. Чем больше сообщений об ошибках, тем более вероятно, что Apple скоро исправит это.
EDIT: Apple окупила мою ошибку в другую - это было, очевидно, известно некоторое время назад.
Ответ 4
До сих пор в Xcode 6.2, iOS 8.2 проблема все еще существует, и обходной путь все еще работает. Быстрая версия:
slider.setThumbImage(slider.thumbImageForState(.Normal), forState:.Normal)