简体   繁体   English

如何使用核心动画为NSTextField的背景颜色设置动画?

[英]How can I use core animation to animate the background color of an NSTextField?

I'm trying to use core animation to highlight a text field as being invalid. 我正在尝试使用核心动画将文本字段突出显示为无效。

[[my_field animator] setBackgroundColor [NSColor yellowColor]]

Updates the field background color, but does not animate the change. 更新字段背景颜色,但不为更改设置动画。 Updating properties such as the position of the field animates properly. 更新属性(例如字段的位置)可以正确设置动画。 I'm assuming this is because background color isn't included in the NSAnimatablePropertyContainer search. 我假设这是因为NSAnimatablePropertyContainer搜索中不包含背景颜色。

I've also tried creating the animation explicitly, to no avail. 我也试过明确地创建动画,但没有用。

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

Suggestions for accomplishing this? 有关完成此事的建议吗?

Merry Christmas: 圣诞节快乐:

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

This will animate the background color of a view using a backed layer. 这将使用支持的图层为视图的背景颜色设置动画。 Remember to set wants layer in the init or awake: 记得在init或awake中设置want层:

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

While I never managed to figure out how to animate the background color, I was able to create the desired effect by animating a CIFalseColor filter. 虽然我从未弄清楚如何设置背景颜色的动画,但我能够通过动画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"];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM