CALayer从当前值淡出

epo*_*gee 5 cocoa-touch core-animation objective-c calayer

我的应用用于CALayer绘制视图.更确切地说,它drawLayer:inContext:UIView顶层的子层上使用该方法.这是一种很好的方法,可以让连续drawLayer:inContext:绘图的"隐式"动画随着时间的推移逐渐消失.衰落动画发生比较快,说不定0.25秒,但要改变其持续时间,简单地实现另一个叫做委托方法actionForLayer:forKey:.在这个完美的工作示例实现中,默认持续时间延长到2.0秒:

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event
{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:event];
    animation.duration = 2.0;
    return animation;

    // or return nil for the default duration.
}
Run Code Online (Sandbox Code Playgroud)

关于手头的问题.

如果你的呼叫[sublayer setNeedsDisplay]速度快于衰落有时间完成,每次新的淡入淡出你都会看到突然跳跃.从它的外观来看,正在进行的淡入淡出被取消,它的最终状态被用作新淡入淡出的起点.这可能不是很令人惊讶,但视觉效果是不必要的.

考虑从黑色到白色的十秒淡入淡出的情景,在开始后五秒钟触发另一次淡入淡出,变为黑色.动画将从黑色渐变为白色,但当它处于"半灰色"时,它会跳到全白色,然后再次变为黑色.

有没有办法防止这种情况发生?我可以让图层从灰色渐变回黑色吗?有没有相当于说法的CALayer绘图UIViewAnimationOptionBeginFromCurrentState(用于UIView动画)?

干杯.

C4 *_*vis 2

图层的动画只是图层动画时的外观的视觉表示。在 CA 中,当您从一种状态制作动画到另一种状态时,图层的整个状态会立即更改。将创建一个表示层并显示动画,当动画完成时,实际层将保留在最后的位置。

所以,我的猜测是,当您想从一种状态转换到另一种状态,并且当前动画尚未完成时,您必须捕获动画的当前状态,然后将其用作下一个动画的起点。

问题在于无法修改图层的当前动画。

在下面的文章中,我捕获动画的当前状态,将其设置为图层的当前状态,并将其用作动画的起始值。这篇文章将此技术应用于动画的速度/持续时间,但也可以应用于您的场景。

/sf/answers/668127211/