2011-01-10 4 views
9

Ich versuche, Core-Animation zu verwenden, um ein Textfeld als ungültig hervorzuheben.Wie kann ich die Kernanimation verwenden, um die Hintergrundfarbe eines NSTextFields zu animieren?

[[my_field animator] setBackgroundColor [NSColor yellowColor]] 

Aktualisiert die Feldhintergrundfarbe, animiert die Änderung jedoch nicht. Das Aktualisieren von Eigenschaften wie der Position des Felds wird ordnungsgemäß animiert. Ich gehe davon aus, dass Hintergrundfarbe nicht in der Suche NSAnimatablePropertyContainer enthalten ist.

Ich habe auch versucht, die Animation explizit zu erstellen, ohne Erfolg.

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

Vorschläge zu diesem Zweck?

Antwort

5

Während ich es nie geschafft habe, herauszufinden, wie man die Hintergrundfarbe animiert, konnte ich den gewünschten Effekt erzeugen, indem ich einen CIFalseColor-Filter animierte.

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

Es scheint, dass die Anwendung von benutzerdefinierten Filter (Filter mit einem benutzerdefinierten Namen) werden nicht von der öffentlichen 10.11 (El Capitan) Beta unterstützt. Der Code funktioniert jedoch, wenn Sie die setName-Zeile weglassen und den Schlüsselpfad auf @ "filters setzen. CIFalseColor.inputColor1"; direkt. – deflozorngott

+1

Auch seit 10.9 müssen Sie self.layerUsesCoreImageFilter = YES; – deflozorngott

15

Frohe Weihnachten:

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

Dies wird die Hintergrundfarbe einer Ansicht mit einer gesicherten Ebene animieren. Denken Sie daran, will Schicht in der Init oder wach gesetzt:

[[[self window] contentView] setWantsLayer:YES]; 
Verwandte Themen