你如何明确动画一个的CALayer的的backgroundColor?你如何明确动画一个的CALay

2019-05-13 08:57发布

我试图构建一个CABasicAnimation进行动画核心动画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的动画属性,所以我的问题是:你怎么为这个特殊的属性(最好是在一台Mac / iPhone平台无关的方式)设置From或To值?

Answer 1:

你并不需要包装CGColorRef设置当s toValuefromValue一个属性CABasicAnimation 。 使用时只需将CGColorRef 。 为了避免编译器警告,你可以施放CGColorRef一个id

在我的示例应用程序,下面的代码动画的背景为红色。

CABasicAnimation* selectionAnimation = [CABasicAnimation 
    animationWithKeyPath:@"backgroundColor"];
selectionAnimation.toValue = (id)[UIColor redColor].CGColor;
[self.view.layer addAnimation:selectionAnimation
                       forKey:@"selectionAnimation"];

然而,当动画结束后,后台返回到原来的颜色。 这是因为, CABasicAnimation动画运行时只影响目标层的表示层。 在动画完成后,该值在模型层返回设定。 所以,你将不得不设置层backgroundColor属性设置为红色为好。 也许关闭使用隐式动画CATransaction

您可以通过首先使用隐式动画这个麻烦保存自己。



Answer 2:

我被这个问题所困扰,直到我实验发现路障。 设置层的backgroundColor属性,直接或通过动画,不会有任何效果,如果你从默认的(未指定)在Interface Builder改变背景颜色,在一个项目(如的UILabel)课程的背景下,是被安置在IB。 所以,离开背景颜色不明确的,上面应该工作。



文章来源: How do you explicitly animate a CALayer's backgroundColor?