我试图链接两个基于关键帧的动画,但第二个动画由于某种原因不能播放。知道发生了什么吗?
// 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];
答案 0 :(得分:1)
将多个动画添加到动画组时,beginTime属性从0开始,并在动画持续时间结束。因此,要链接第二个动画,将它的beginTime设置为第一个动画的持续时间,并使动画组的持续时间足够长,以适应整个动画序列。
顺便说一句,创建一个将2条路径合并为一条的单个CAKeyframeAnimation可能更简单。这将是更少的代码。