Как я могу использовать основную анимацию для анимации цвета фона NSTextField?

Я пытаюсь использовать основную анимацию, чтобы выделить текстовое поле как недопустимое.

[[my_field animator] setBackgroundColor [NSColor yellowColor]]

Обновляет цвет фона поля, но не анимирует изменение. Обновление свойств, таких как положение поля, анимируется правильно. Я предполагаю, что это связано с тем, что цвет фона не включен в поиск NSAnimatablePropertyContainer.

Я также пытался создать анимацию явно, но безрезультатно.

CABasicAnimation *ani;
ani = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];

ani.fromValue = CGColorCreateGenericRGB(1.0,1.0,1.0,1.0);
ani.toValue = CGColorCreateGenericRGB(1.0,0.0,0.0,1.0);
ani.repeatCount = 2;
ani.autoreverses = YES;
ani.duration = 1.0;

[[my_field layer] addAnimation:ani forKey:"backgroundColor"];

Предложения по выполнению этого?


person Reid Beels    schedule 10.01.2011    source источник


Ответы (2)


Счастливого Рождества:

NSView *content = [[self window] contentView];
CALayer *layer = [content layer];

CABasicAnimation *anime = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
anime.fromValue = (id)[layer backgroundColor];
anime.toValue = (id)CGColorCreateGenericGray(0.0f, 1.0f);
anime.duration = 5.0f;
anime.autoreverses = YES;

[layer addAnimation:anime forKey:@"backgroundColor"];

Это анимирует цвет фона представления, используя резервный слой. Не забудьте установить слой желаний в инициализации или бодрствовании:

[[[self window] contentView] setWantsLayer:YES];
person Arvin    schedule 22.02.2011

Хотя мне так и не удалось понять, как анимировать цвет фона, я смог создать желаемый эффект, анимировав фильтр CIFalseColor.

CIFilter *filter = [CIFilter filterWithName:@"CIFalseColor"];
[filter setDefaults];
[filter setValue:[CIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0] forKey:@"inputColor0"];
[filter setValue:[CIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0] forKey:@"inputColor1"];
[filter setName:@"pulseFilter"];
[[myField layer] setFilters:[NSArray arrayWithObject:filter]];

CABasicAnimation* pulseAnimation = [CABasicAnimation animation];
pulseAnimation.keyPath = @"filters.pulseFilter.inputColor1";

pulseAnimation.fromValue = [CIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
pulseAnimation.toValue = [CIColor colorWithRed:0.995 green:1.0 blue:0.655 alpha:1.0];

pulseAnimation.duration = 0.3;
pulseAnimation.repeatCount = 1;
pulseAnimation.autoreverses = YES;

[[myField layer] addAnimation:pulseAnimation forKey:@"pulseAnimation"];
person Reid Beels    schedule 12.01.2011
comment
Похоже, что применение пользовательских фильтров (фильтров с настраиваемым именем) не поддерживается общедоступной бета-версией 10.11 (El Capitan). Однако код работает, если вы опускаете строку setName и устанавливаете ключевой путь на @filters. CIFalseColor.inputColor1; напрямую. - person deflozorngott; 21.07.2015
comment
Также с 10.9 вам нужно добавить self.layerUsesCoreImageFilter = YES; - person deflozorngott; 21.07.2015