iphone - 如何明确地为 CALayer 的背景颜色设置动画?

标签 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 平台无关的方式)?

最佳答案

设置 CABasicAnimationtoValuefromValue 属性时,无需包装 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/

相关文章:

iphone - 如何检查 objective-c 中的变量是否每秒或更少发生变化?

cocoa - NSToolbarItem 的屏幕位置

cocoa - 用于创建 OS X 小部件的 OpenGL 或 QuartzComposer

macos - 如何在Mac上安装erlang观察者?

c++ - 编译三个 C++ 文件。链接错误

iphone - NSDateFormatter 无法与 UTC 正常工作

iphone - 插入后 NSMutableDictionary 重新排序元素

macos - Mac 上的 Makefile 自动完成

iphone - 使用填充将UIWebView内容居中

cocoa - 打印时自动在预览中打开 PDF