CALayer不透明度动画

21

我想创建一个CALayer动画,给人一种“闪光”的效果。为此,我尝试对“透明度”属性进行动画处理,但我的问题是我不知道从哪里开始和如何实现。

这里是动画的图形解释:

opacity
   |    ___
1  |   |   |
   |   |   |    * repeatCount
0  |___|   |_ . . .
   -------------------------> time
    |______|
    duration

透明度开始为0,然后动画变为1,再变为0 (这个0到1到0的动画持续秒数等于duration)。然后这个过程会重复'repeatCount'次。

以下是代码的背景信息:

float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc
int repeactCount = ...; // 1, 2, 5, 6, ect

CALayer* layer = ...; // I have a CALayer from another part of the code
layer.opacity = 0;

// Animation here

done = YES; // IN THE END of the animation set this ivar to yes

如何最好地实现这个?我以前从未使用过CALayers,所以这也是一个很好的机会来学习一下它们的动画系统。顺便说一句,我已经查阅了文档,并且理解了如何添加一个或两个简单的动画,但是我不知道如何做到这一点。

2个回答

48

实现这个的最佳方式是使用显式动画(参见 指南),通过创建一个CABasicAnimation实例并将其添加到层中。

代码应该类似于:

CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"];
flash.fromValue = [NSNumber numberWithFloat:0.0];
flash.toValue = [NSNumber numberWithFloat:1.0];
flash.duration = 1.0;        // 1 second
flash.autoreverses = YES;    // Back
flash.repeatCount = 3;       // Or whatever

[layer addAnimation:flash forKey:@"flashAnimation"];
如果您想知道动画何时完成,可以设置一个委托并实现animationDidStop:finished:方法,但最好使用完成块,因为这使得所有代码都在同一个位置。如果您编写的是iOS 4或OS X,则可以使用优秀的CAAnimationBlocks类别来完成此操作。

谢谢!那个完美地运作了。只有一件事:它应该是“animationWithKeyPath:”。 - Alex
@Alex 好的,我会更新答案(这是凭记忆写的,不一定是最可靠的来源...) - trojanfoe
我不明白。它淡入后立即消失了。 - Iulian Onofrei
@trojanfoe 这个"guide"是不是应该链接到这里?https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/CreatingBasicAnimations/CreatingBasicAnimations.html#//apple_ref/doc/uid/TP40004514-CH3-SW1 - Ky -

2
Trojanfoe的回答很好。我只想补充一点,如果你想更好地控制“时间轴”(淡出需要多长时间?然后我们要等多久?然后淡入需要多长时间?等等),你需要将多个CABasicAnimation组合成CAAnimationGroup。
你可能想阅读我关于这个主题的书籍章节,其中最后一部分构成了CAAnimation及其子类的教程:

http://www.apeth.com/iOSBook/ch17.html#_core_animation

请注意,我的讨论是针对iOS的;在Mac OS X上,如果您在那里,视图/层架构有点不同,但它对于CAAnimation的说明仍然是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接