我想创建一个CALayer动画,它会产生一种“浮华”效果。为此,我试图动画“不透明”属性,但我的问题是我不知道从哪里开始以及如何做。
以下是动画的图解说明:
opacity
| ___
1 | | |
| | | * repeatCount
0 |___| |_ . . .
-------------------------> time
|______|
duration
不透明度从0开始,然后动画为1,然后再次为0(此0到1到0的动画需要等于持续时间的秒数)。然后这个过程重复'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,所以这也是了解他们的动画系统如何工作的好机会。顺便说一句,我搜索了文档,我理解你如何添加一两个简单的动画,但我不知道如何做这个特定的动画。
答案 0 :(得分:44)
实现此目的的最佳方法是通过创建CABasicAnimation
的实例并将其添加到图层来使用显式动画(请参阅guide)。
代码看起来像这样:
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类别来完成此任务。
答案 1 :(得分:2)
Trojanfoe的答案很棒。我只想补充一点,如果你想要更多地控制“时间线”(淡出需要多长时间?我们应该等多久?然后需要多长时间才能淡入?等等)你是想要将多个CABasicAnimation
组合成一个CAAnimationGroup。
您可能希望阅读我关于此主题的书籍章节,其中最后一部分构成了CAAnimation及其后代的教程:
http://www.apeth.com/iOSBook/ch17.html#_core_animation
请注意,我的讨论是针对iOS的;在Mac OS X上,如果你就是这样,那么视图/图层架构会有所不同,但它对CAAnimation的描述仍然是正确的。