我想创建一个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,所以这也是学习他们的动画系统是如何工作的好机会。 顺便说一句,我已经搜查了文档,我知道你是如何增加一个或两个简单的动画,但我不知道如何做到这一点特别的一个。
要做到这一点,最好的方法是使用一个明确的动画(见指南创建的实例) 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类别来做到这一点。
Trojanfoe的答案是优秀的。 我只想补充一点,如果你想在“时间线”更多的控制(应该需要多长时间淡出?多久,我们应该再等待?那么多长时间,要花淡入?等等),你会想多合并CABasicAnimation
s转换为CAAnimationGroup。
你可能需要阅读关于这个主题我的书章,该章的最后部分,构成了对CAAnimation及其后代的教程:
http://www.apeth.com/iOSBook/ch17.html#_core_animation
请注意,我的讨论是针对iOS的; 在Mac OS X,如果这是你身在何处,视图/层架构是一个有点不同,但它说什么关于CAAnimation仍然是正确的。