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)