2011-01-10 15 views
9

Estoy tratando de usar animación central para resaltar un campo de texto como no válido.¿Cómo puedo usar animación central para animar el color de fondo de un NSTextField?

[[my_field animator] setBackgroundColor [NSColor yellowColor]] 

Actualiza el color de fondo del campo, pero no anima el cambio. Las propiedades de actualización, como la posición del campo, se animan correctamente. Supongo que es porque el color de fondo no está incluido en la búsqueda NSAnimatablePropertyContainer.

También intenté crear la animación explícitamente, fue en vano.

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"]; 

Sugerencias para lograr esto?

Respuesta

5

Aunque nunca logré descubrir cómo animar el color de fondo, pude crear el efecto deseado animando un filtro 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"]; 
+0

Parece que la aplicación de filtros personalizados (filtros con un nombre personalizado) no son compatibles con la versión beta pública 10,11 (El Capitán). Sin embargo, el código funciona cuando omite setName-line y establece keypath en @ "filtros. CIFalseColor.inputColor1"; directamente. – deflozorngott

+1

También desde 10.9 necesita agregar self.layerUsesCoreImageFilter = YES; – deflozorngott

15

Feliz Navidad:

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"]; 

Esto animar el color de fondo de una vista usando una capa de respaldo. Recuerde que debe establecer quiere capa en el init o despierto:

[[[self window] contentView] setWantsLayer:YES]; 
Cuestiones relacionadas