Как я могу получить максимальныйTrackTintColor по умолчанию для UISlider

Я пытаюсь сделать так, чтобы UISlider имел оттенок цвета с правой стороны и тусклый цвет с левой стороны (поменяйте их местами)

Я могу получить правильный цвет справа с помощью

mySlider.maximumTrackTintColor = self.view.tintColor

но я не знаю, как получить серый цвет, чтобы установить minimumTrackTintColor.

Я старался

mySlider.minimumTrackTintColor = mySlider.maximumTrackTintColor

до того, как я установил maximumTrackTintColor, но это не работает, потому что mySlider.maximumTrackTintColor возвращает ноль, если пользовательский цвет не был установлен.


person Grezzo    schedule 25.12.2014    source источник
comment
Я знаю, что могу сделать UIColor.lightGrayColor(), но цвет по умолчанию может измениться в будущей версии iOS, поэтому я хочу программно выяснить, что используется в UISlider.   -  person Grezzo    schedule 26.12.2014
comment
Вы хотите изменить насыщенность цвета?   -  person Leo Dabus    schedule 26.12.2014
comment
@LeonardoSavioDabus По умолчанию дорожка слева от большого пальца синяя, а справа — серая. Я хочу, чтобы слева от большого пальца был серый, а справа - серый. Но я не хочу просто сделать его серым; Я хочу узнать, какие цвета используются UISlider, и поменять их местами.   -  person Grezzo    schedule 26.12.2014
comment
Я знаю, что это глупо, но, может быть, вы могли бы просто повернуть элемент управления на 180 градусов и нормализовать значение в обратном вызове делегата?   -  person siejkowski    schedule 26.12.2014
comment
@siejkowski Я думал об этом, но если в будущем они установят тень или аналогичный эффект, это будет выглядеть странно.   -  person Grezzo    schedule 26.12.2014


Ответы (1)


Итак, проблема в том, что вы пытаетесь получить tintColor, но стандартный ненастраиваемый UISlider для ванильного iOS8 не использует tintColor для установки своих цветов.

Используется imageForState.

Таким образом, вы можете получить изображения с помощью методов slider.minimumTrackImageForState(UIControlState.Normal)! и slider.maximumTrackImageForState(UIControlState.Normal)!.

Однако, чтобы быть более защищенным, я бы рекомендовал попробовать оба подхода:

let minimumColor = slider.minimumTrackTintColor
let maximumColor = slider.maximumTrackTintColor
let minimumImage = slider.minimumTrackImageForState(UIControlState.Normal)
let maximumImage = slider.maximumTrackImageForState(UIControlState.Normal)

if let minimumColor = minimumColor {
    slider.maximumTrackTintColor = minimumColor
} else if let minimumImage = minimumImage {
    slider.setMaximumTrackImage(minimumImage, forState: .Normal)
} else {
    // ok, something has changed the big way, just fallback on some color you like
}

if let maximumColor = maximumColor {
    slider.minimumTrackTintColor = maximumColor
} else if let maximumImage = maximumImage {
    slider.setMinimumTrackImage(maximumImage, forState: .Normal)
} else {
    // ok, something has changed the big way, just fallback on some color you like
}

Результат (верхнее изображение до, нижнее изображение после):

введите здесь описание изображения

person siejkowski    schedule 25.12.2014
comment
Хорошо замечено, что он использует изображения, а не оттенок. Но ваш код просто делает дорожки толще, а не меняет цвета. - person Grezzo; 26.12.2014
comment
@Grezzo Не могли бы вы предоставить дополнительную информацию? Я обновил ответ с полученным результатом, и кажется, что он меняет цвета и не делает дорожки толще. Какой у вас код? Что вы видите после установки правильных изображений для состояний? - person siejkowski; 26.12.2014
comment
Я использовал ваш код, но заменил slider на свой ползунок IBOutlet (называемый rightSlider). Я зарегистрировал минимальный/максимальный цвет/изображение, и все они были nil. Я изменил комментарий «что-то изменилось» на зарегистрированную строку, и в итоге это было зарегистрировано. - person Grezzo; 26.12.2014
comment
Я сделал простой проект, используя ваш код (у меня он не работает) и выложил его на GitHub: github. ком/Греццо/SliderSwap - person Grezzo; 26.12.2014
comment
@Grezzo Большое спасибо! Кажется, что по какой-то причине slider не установлены изображения до того, как они будут показаны на экране. Перемещение кода в viewDidAppear позволяет правильно сообщать все значения. Я действительно понятия не имею, почему это так - вероятно, это деталь реализации класса UISlider. - person siejkowski; 26.12.2014
comment
Я понимаю. Жаль, что это нельзя сделать до того, как появится представление, но я думаю, имеет смысл, что к тому времени он еще не загрузил изображения. Спасибо за вашу помощь! - person Grezzo; 26.12.2014