我正在尝试构造一个 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 平台无关的方式)?
最佳答案
设置 CABasicAnimation
的 toValue
或 fromValue
属性时,无需包装 CGColorRef
。只需使用CGColorRef
。为了避免编译器警告,您可以将 CGColorRef
强制转换为 id
。
在我的示例应用程序中,以下代码将背景动画为红色。
CABasicAnimation* selectionAnimation = [CABasicAnimation
animationWithKeyPath:@"backgroundColor"];
selectionAnimation.toValue = (id)[UIColor redColor].CGColor;
[self.view.layer addAnimation:selectionAnimation
forKey:@"selectionAnimation"];
但是,当动画结束时,背景将恢复为原始颜色。这是因为CABasicAnimation
仅在动画运行时影响目标层的表示层。动画结束后,模型层设置的值返回。因此,您还必须将图层 backgroundColor
属性设置为红色。也许使用 CATransaction 关闭隐式动画。
您可以通过首先使用隐式动画来避免这个麻烦。
关于iphone - 如何明确地为 CALayer 的背景颜色设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/518192/