Я создаю простой выбор цвета, управляемый пользовательским элементом управления ползунком.Как вы оптимизируете UIColor на iPhone?
Я передаю значение float из своего ползунка в метод конструктора UIColor и обновляю цвет фона CALayer при изменении значения.
Он работает очень плавно в симуляторе, но при работе на устройстве я получаю много мерцания.
Это только потому, что это связано с налогообложением GPU? Странно, когда вы двигаетесь через синий цвет. И изменение альфа-значения и яркости мерцает больше, чем изменение насыщенности и оттенка.
Должен ли я не передавать произвольные значения float при изменении значения ползунка? Если нет, как я могу ограничить это до меньших цветов для оптимизации?
Я думал об отключении неявных анимаций для свойства backgroundColor CALayer, но я не уверен, как это сделать.
Есть ли какие-либо трюки для оптимизации изменений UIColor.
Update
Я не использую DrawRect: или drawInRect:
Я просто изменить свойство BackgroundColor в виде CALayer. Каждый раз, когда touchsMoved: называется «Я захватил место», создаю значение с плавающей точкой от 0.0 до 1.0 и передаю сообщение моему делегату о том, что значение изменилось и вызывается метод (void) updateCurrentColor.
Вот пример моей реализации:
@implementation MyCustomSliderView
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
hueLocation = [[touches anyObject] locationInView:self];
//Smoothing
if ((hueLocation.x > previousHueLocation.x) && ((hueLocation.x - previousHueLocation.x) > 1.0) && (hueLocation.x - previousHueLocation.x) < 10.0) {
hueLocation.x = previousHueLocation.x + 1.0;
}
if ((hueLocation.x < previousHueLocation.x) && ((previousHueLocation.x - hueLocation.x) > 1.0) && (previousHueLocation.x - hueLocation.x) < 10.0) {
hueLocation.x = previousHueLocation.x - 1.0;
}
//Percentage of screen.
hueValue = hueLocation.x/self.bounds.size.width;
//Clip to 1.0 & 0.0
if (hueValue > 1.0) {
hueValue = 1.0;
}
if (hueValue < 0.0) {
hueValue = 0.0;
}
NSLog(@"Value is: %f", hueValue);
NSLog(@"Location %f", hueLocation.x);
previousHueLocation = hueLocation;
if([delegate respondsToSelector:@selector(updateCurrentColor)]) {
[delegate updateCurrentColor];
}
}
@implementation MyViewController
- (void)updateCurrentColor {
currentColor = [UIColor colorWithHue:hueSliderView.hueValue
saturation:saturationSliderView.saturationValue
brightness:brightnessSliderView.brightnessValue
alpha:alphaSliderView.alphaValue];
colorLayer.backgroundColor = currentColor.CGColor;
}
Сначала я подумал, что это прыгал значение из-за неточности сенсорного интерфейса. Функция сглаживания помогла, но она все еще мерцает, особенно с альфа-значением, даже когда мое местоположение изменяется только на 1 пиксель. Должен ли я ограничивать это ограниченным количеством цветов/значений вместо простого прохождения в произвольном поплавке? Опять же, отлично работает в симуляторе, кажется, просто проблема с производительностью.
Опишите эффект, который вы получаете. Есть ли видимые вертикальные/горизонтальные «бары», где изменение видимо? Временно ли исчезают элементы? Получаете ли вы видимый, но нежелательный цвет перехода? – Artelius
Нет баров. Цвет мерцает светлым и темным при изменении значений (оттенок, насыщенность, яркость, альфа). Если я иду очень медленно, это лучше, но все же иногда мерцает. Я скорректировал метод touchesMoved, чтобы перемещать только один пиксель за раз, не двигаясь выше 15. Это помогло. Тем не менее мерцает. –