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