链接关键帧动画

时间:2014-03-19 21:38:05

标签: ios core-animation cakeyframeanimation

我试图链接两个基于关键帧的动画,但第二个动画由于某种原因不能播放。知道发生了什么吗?

// Create an animation group to contain all album art animations
    CAAnimationGroup *albumArtAnimationGroup = [CAAnimationGroup animation];
    albumArtAnimationGroup.duration = 3.0;
    albumArtAnimationGroup.repeatCount = 0;

    // First album art translation animation
    CGMutablePathRef albumCoverPath = CGPathCreateMutable();
    CGPathMoveToPoint(albumCoverPath, NULL,
                      albumCover.layer.position.x,
                      albumCover.layer.position.y);
    CGPathAddLineToPoint(albumCoverPath, NULL,
                         albumCover.layer.position.x-[UIScreen mainScreen].bounds.size.height,
                         albumCover.layer.position.y);
    CAKeyframeAnimation *albumCoverTranslationAnimation;
    albumCoverTranslationAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    albumCoverTranslationAnimation.calculationMode = kCAAnimationLinear;
    albumCoverTranslationAnimation.path = albumCoverPath;
    albumCoverTranslationAnimation.duration = 1.0;

    // Second album art translation animation
    CGMutablePathRef albumCoverPath1 = CGPathCreateMutable();
    CGPathMoveToPoint(albumCoverPath1, NULL,
                      albumCover.layer.position.x+[UIScreen mainScreen].bounds.size.height,
                      albumCover.layer.position.y);
    CGPathAddLineToPoint(albumCoverPath1, NULL,
                         albumCover.layer.position.x,
                         albumCover.layer.position.y);
    CAKeyframeAnimation *albumCoverTranslationAnimation1;
    albumCoverTranslationAnimation1 = [CAKeyframeAnimation animationWithKeyPath:@"position"];
    albumCoverTranslationAnimation1.calculationMode = kCAAnimationLinear;
    albumCoverTranslationAnimation1.path = albumCoverPath1;
    albumCoverTranslationAnimation1.duration = 1.0;
    CFTimeInterval localAlbumLayerTime = [albumCover.layer convertTime:CACurrentMediaTime() fromLayer:nil];
    albumCoverTranslationAnimation1.beginTime = localAlbumLayerTime + 1.0;

 albumArtAnimationGroup.animations = @[albumCoverTranslationAnimation, albumCoverTranslationAnimation1];

    [albumCover.layer addAnimation:albumArtAnimationGroup forKey:@"position"];

修改

解决。事实证明,Apple的文档都有误导性,或者我错误地使用了CACurrentMediaTime。下面的代码完成了诀窍。

albumArtAnimationGroup.duration = 2.0;
albumCoverTranslationAnimation.duration = 1.0;
albumCoverTranslationAnimation1.beginTime = 1;
albumArtAnimationGroup.animations = @[albumCoverTranslationAnimation, albumCoverTranslationAnimation1];
[albumCover.layer addAnimation:albumArtAnimationGroup forKey:@"position"];

然而,根据Apple的说法,我可能会因为我没有使用CACurrentMediaTime()而遇到时间问题,如下所示。

  

帮助您确保时间值适合给定的时间   图层,CALayer类定义convertTime:fromLayer:和   convertTime:toLayer:方法。您可以使用这些方法转换   将时间值固定为图层的本地时间或转换时间   从一层到另一层的值。这些方法考虑到了   媒体计时属性可能会影响图层的本地时间   并返回一个可以与其他图层一起使用的值。清单5-3   显示了一个应该定期使用以获取当前值的示例   图层的本地时间。 CACurrentMediaTime函数是一个   便利功能,返回计算机的当前时钟时间,   该方法采用并转换为图层的本地时间。

清单5-3获取图层的当前本地时间

CFTimeInterval localLayerTime = [myLayer convertTime:CACurrentMediaTime() fromLayer:nil];

1 个答案:

答案 0 :(得分:1)

将多个动画添加到动画组时,beginTime属性从0开始,并在动画持续时间结束。因此,要链接第二个动画,将它的beginTime设置为第一个动画的持续时间,并使动画组的持续时间足够长,以适应整个动画序列。

顺便说一句,创建一个将2条路径合并为一条的单个CAKeyframeAnimation可能更简单。这将是更少的代码。