UISlider setMaximumTrackTintColor

Я пытаюсь динамически настроить цвет трека на UISlider.

Эта строка кода отлично работает для установки нижней стороны слайдера.

[self.sliderBar setMinimumTrackTintColor:[UIColor redColor]];

При попытке сделать то же самое для высокой стороны дорожки слайдера эта строка кода сообщает о 3 фатальных ошибках в журнале отладки.

[self.sliderBar setMaximumTrackTintColor:[UIColor redColor]];

<Error>: CGContextAddPath: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context  and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.

<Error>: clip: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context  and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.

<Error>: CGContextDrawLinearGradient: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context  and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.

Я также попытался установить цвета оттенков дорожки с использованием точечной нотации, но сообщалось о тех же 3 ошибках.

self.sliderBar.maximumTrackTintColor = [UIColor redColor];

Я очень смущен, почему минимальный цвет оттенка цвета правильно установлен, в то время как максимальный цвет оттенка цвета ломается. Будем очень благодарны любой помощи.

Эта проблема, похоже, связана с этим вопросом, но я не уверен на 100%, так как я не работаю с графикой (только установив цвет оттенка).

Ответы

Ответ 1

Это странно, и min, и max работают отлично для меня, и я могу даже изменить его цвет. Все, что я могу предложить, это воссоздать слайдер, а также @synthesize.

@synthesize slider;

- (void)viewDidLoad
{
[super viewDidLoad];
[slider setMinimumTrackTintColor:[UIColor orangeColor]];
[slider setMaximumTrackTintColor:[UIColor blueColor]];



// Do any additional setup after loading the view, typically from a nib.
}

Slider with 2 different colors

Ответ 2

Избегайте избыточности параметра maximumTrackTintColor. Когда мой код дважды обновлял цвет, максимальная строка просто исчезла. Я смог воспроизвести его с помощью простого UISlider, например:

    UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, 150, 23)];
    slider.maximumTrackTintColor = [UIColor whiteColor];
    slider.maximumTrackTintColor = [UIColor whiteColor];

Вместо белой дорожки этот слайдер не будет иметь максимальной дорожки при отображении на экране под iOS 8.

Ответ 3

Это ошибка Apple, и она все еще существует в iOS 8. Я видел ее при попытке изменить максимальный цвет оттенков слайдеров с помощью прокси-сеттера в подклассе. Изменение минимального цвета оттенка отлично работает и не отображает ошибок, но попытка изменить максимальный цвет оттенка вызывает множество плохих контекстных ошибок и часто рисует ту часть градиента слайдера в неправильном месте (что доказывает, что он действительно не имеет хорошего контекста).

Я не мог найти обходной путь для проблемы, но будет файл отчета об ошибке.

Ответ 4

Для меня проблема возникла из-за того, что я создал подклассу UISlider для создания пользовательского trackRectForBounds, который возвращал CGRect с недопустимым размером. Моя первоначальная реализация (и, возможно, некоторые версии версии iOS?) Вернула границы треков с нулевым или отрицательным размером в зависимости от границ UISlider. Похоже, что это связано с тем, что установка minimum/maximumTrackTintColor вызовет trackRectForBounds, возможно, для создания образа дорожки.

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

Вариант 1: используйте initWithFrame, размер которого достаточно для UISlider

UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0,0,100,38)];
slider.minimumTrackTintColor = [UIColor greenColor];
slider.maximumTrackTintColor = [UIColor orangeColor];
// ... rest of view setup ...

Вариант 2: добавьте слайдер и принудительно создайте макет, чтобы он был правильно установлен до установки цветов оттенка

UISlider *slider = [[UISlider alloc] init]; // <-- problem, zero size
[view addSubview:slider];
// ... other view setup, including constraints ...
[view layoutIfNeeded]; // forced layout to give slider a non-zero size
slider.minimumTrackTintColor = [UIColor greenColor];
slider.maximumTrackTintColor = [UIColor orangeColor];

Вариант 3: исправьте переопределение, чтобы убедиться, что он вернет прямоугольник ненулевого размера, независимо от его границ.

- (CGRect)trackRectForBounds:(CGRect)bounds {
     // example, inset left/right by 2 (thus width - 4)
     // track height is 5 pixels, centered in bounds.
     return CGRectMake(
         CGRectGetMinX(bounds) + 2,
         CGRectGetMinY(bounds) + (CGRectGetHeight(bounds) + 5)/2.0,
         MAX(10, CGRectGetWidth(bounds) - 4), // use max make sure positive.
         5)
}

Примечание. Я создаю UISliders после viewDidLoad, поэтому Ответ Ахауфорда не будет работать для меня, но я предполагаю, что это также может объяснить это. Я бы также предположил, что Ответ Агаффорда, вероятно, будет работать лучше всего в большинстве случаев.

Ответ 5

Я считаю, что это проблема Apple. Есть много людей, которые сообщают о странном поведении UISlider с 7.1. Я лично не могу изменить минимальный цвет оттенка. Думаю, в этот момент вы ничего не можете сделать.

Ответ 6

IOS 8.3
Он работает с помощью методов тезисов:

[slider setMinimumTrackTintColor:[UIColor orangeColor]];
[slider setMaximumTrackTintColor:[UIColor blueColor]];

ИЛИ:

slider.minimumTrackTintColor = [UIColor orangeColor];
slider.maximumTrackTintColor = [UIColor blueColor];

ИЗМЕНИТЬ
Извините, мне пришлось ошибаться во время моих тестов... Но я не могу изменить maximumTrackTintColor через Interface Builder....
Используйте вышеописанные методы, если вы хотите изменить maximumTrackTintColor UISlider