你如何明确动画CALayer的backgroundColor动画?

时间:2009-02-05 22:08:22

标签: iphone cocoa macos core-animation

我正在尝试构建一个CABasicAnimation来动画Core Animation CALayer的backgroundColor属性,但我无法弄清楚如何正确包装CGColorRef值以传递给动画。例如:

CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB();
CGFloat values[4] = {1.0, 0.0, 0.0, 1.0}; 
CGColorRef red = CGColorCreate(rgbColorspace, values); 
CGColorSpaceRelease(rgbColorspace);

CABasicAnimation *selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
[selectionAnimation setDuration:0.5f];
[selectionAnimation setToValue:[NSValue valueWithPointer:red]];
[layer addAnimation:selectionAnimation forKey:@"selectionAnimation"];

似乎对backgroundColor属性没有任何作用,我假设因为将它作为包裹在NSValue中的指针移交它不是传递它的方法。

backgroundColor是CALayer的一个可动画属性,所以我的问题是:如何设置此特定属性的From或To值(最好是以Mac / iPhone平台无关的方式)?

2 个答案:

答案 0 :(得分:58)

在设置CGColorRef的{​​{1}}或toValue属性时,您无需打包fromValue。只需使用CABasicAnimation即可。为避免编译器警告,您可以将CGColorRef强制转换为CGColorRef

在我的示例应用中,以下代码将背景设置为红色。

id

但是,当动画结束时,背景将返回原始颜色。这是因为CABasicAnimation* selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; selectionAnimation.toValue = (id)[UIColor redColor].CGColor; [self.view.layer addAnimation:selectionAnimation forKey:@"selectionAnimation"]; 仅在动画运行时影响目标图层的表示层。动画结束后,模型图层中设置的值将返回。因此,您还必须将图层CABasicAnimation属性设置为红色。也许使用backgroundColor关闭隐式动画。

首先使用隐式动画,你可以省去这个麻烦。

答案 1 :(得分:2)

我一直在努力解决这个问题,直到我通过实验找到了障碍。直接或通过动画设置图层的backgroundColor属性,如果您在Interface Builder中的默认(未指定)中更改背景颜色,则在项目(例如UILabel)的上下文中将无效被安置在IB。因此,请不要指定背景颜色,以上情况应该有效。