2011-01-10 14 views
9

Próbuję użyć animacji rdzenia, aby podświetlić pole tekstowe jako nieprawidłowe.Jak używać animacji rdzenia do animowania koloru tła pola NSTextext?

[[my_field animator] setBackgroundColor [NSColor yellowColor]] 

Uaktualnia kolor tła pola, ale nie animuje zmiany. Aktualizowanie właściwości, takich jak położenie pola, animuje się prawidłowo. Zakładam, że tak jest, ponieważ kolor tła nie jest zawarty w wyszukiwaniu NSAnimatablePropertyContainer.

Próbowałem również wyraźnie stworzyć animację, bezskutecznie.

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

Sugestie do osiągnięcia tego?

Odpowiedz

5

Chociaż nigdy nie udało mi się wymyślić, jak animować kolor tła, udało mi się stworzyć pożądany efekt, animując filtr 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

Wygląda na to, że stosowanie niestandardowych filtrów (filtry o niestandardowej nazwie) nie jest obsługiwane przez publiczną wersję beta 10.11 (El Capitan). Kod działa jednak, gdy pominiesz linię setName i ustawisz keypath na @ "filters. CIFalseColor.inputColor1"; bezpośrednio. – deflozorngott

+1

Również od 10.9 musisz dodać self.layerUsesCoreImageFilter = YES; – deflozorngott

15

Wesołych Świąt:

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

To będzie animować kolor tła przy użyciu widoku kopii warstwy. Pamiętaj, aby ustawić warstwę potrzebną w init lub na czuwaniu:

[[[self window] contentView] setWantsLayer:YES]; 
Powiązane problemy