2011-01-10 11 views
9

Sto tentando di utilizzare l'animazione principale per evidenziare un campo di testo come non valido.Come posso utilizzare l'animazione core per animare il colore di sfondo di un NSTextField?

[[my_field animator] setBackgroundColor [NSColor yellowColor]] 

Aggiorna il colore di sfondo del campo, ma non anima la modifica. Aggiornamento delle proprietà come la posizione del campo si anima correttamente. Presumo questo perché il colore di sfondo non è incluso nella ricerca NSAnimatablePropertyContainer.

Ho anche provato a creare l'animazione esplicitamente, senza risultato.

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

Suggerimenti per realizzare questo?

risposta

5

Mentre non sono mai riuscito a capire come animare il colore di sfondo, sono riuscito a creare l'effetto desiderato 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

Sembra che l'applicazione di filtri personalizzati (filtri con un nome personalizzato) non sia supportata dalla versione pubblica 10.11 (El Capitan) beta. Il codice funziona comunque, quando si omette la riga setName e si imposta il keypath su "filtri .CIFalseColor.inputColor1"; direttamente. – deflozorngott

+1

Inoltre dal 10.9 è necessario aggiungere self.layerUsesCoreImageFilter = YES; – deflozorngott

15

Buon Natale:

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

Questo animerà il colore di una visione di fondo con uno strato di appoggio. Ricorda di impostare il livello desiderato in init o sveglio:

[[[self window] contentView] setWantsLayer:YES]; 
Problemi correlati