【问题标题】:How do you explicitly animate a CALayer's backgroundColor?你如何明确地为 CALayer 的 backgroundColor 设置动画?
【发布时间】:2010-10-05 19:33:07
【问题描述】:

我正在尝试构造一个 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 平台无关的方式)?

【问题讨论】:

    标签: iphone cocoa macos core-animation


    【解决方案1】:

    在设置CABasicAnimationtoValuefromValue 属性时,您不需要包装CGColorRefs。只需使用CGColorRef。为避免编译器警告,您可以将 CGColorRef 强制转换为 id

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

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

    但是,当动画结束时,背景会恢复到原来的颜色。这是因为CABasicAnimation 仅在动画运行时影响目标层的表示层。动画结束后,模型层中设置的值返回。因此,您还必须将图层 backgroundColor 属性设置为红色。也许使用CATransaction 关闭隐式动画。

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

    【讨论】:

    • 甜蜜。您会认为他们会将类型转换记录为 id 某处。是的,我可以通过隐式动画让我的生活更轻松,但这让我很烦恼。为了使这种情况持续存在,您只需将动画的 fillMode 设置为 kCAFillModeForwards 并将 removedOnCompletion 设置为 NO。
    • 或者您可以节省大量时间并使用 Facebook Pop 库:github.com/facebook/pop。此处的示例:github.com/maxmyers/FacebookPop
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2011-11-03
      • 2012-11-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多