如何同步几个不同图层的 CAKeyframeAnimation 动画?

Posted

技术标签:

【中文标题】如何同步几个不同图层的 CAKeyframeAnimation 动画?【英文标题】:How to synchronise CAKeyframeAnimation animations of several different layers? 【发布时间】:2014-04-03 15:54:29 【问题描述】:

我需要为 5 个视图的移动设置动画,每个视图都从前一个视图延迟开始。我已经有了一个视图的工作动画:

// Create position points
NSArray * pathArray = @[
                        [NSValue valueWithCGPoint:CGPointMake(0, 0)],
                        [NSValue valueWithCGPoint:CGPointMake(50, 0)],
                        [NSValue valueWithCGPoint:CGPointMake(80, 0)],
                        [NSValue valueWithCGPoint:CGPointMake(130, 0)]
                        ];

// Create animation 
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];

pathAnimation.values = pathArray;

// Add relative timing for each position
pathAnimation.keyTimes = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0],
                      [NSNumber numberWithFloat:.2],
                      [NSNumber numberWithFloat:.8],
                      [NSNumber numberWithFloat:1.0], nil];

// Define animation type for each frame
pathAnimation.timingFunctions = [NSArray arrayWithObjects:
                             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], // from keyframe 1 to keyframe 2
                             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear], // from keyframe 2 to keyframe 3
                             [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn], nil]; // from keyframe 3 to keyframe 4

// Set duration for whole animation
pathAnimation.duration = 1.0;

// Perform repeat
pathAnimation.repeatCount = HUGE_VALF;

// Add animation
CALayer *layer = _myView.layer;
[layer addAnimation:pathAnimation forKey:@"position"];

现在我需要以某种方式使用 4 个具有相同动画但有延迟的视图,以便所有 5 个视图都按顺序进行动画处理。例如,我需要在 1 秒后为第二个视图设置动画,然后在 1 秒后为第三个视图设置动画,以此类推。应该如何正确完成?

【问题讨论】:

【参考方案1】:

您应该使用CACurrentMediaTime()。我也有类似的问题,看看这个answer

【讨论】:

【参考方案2】:

“按顺序制作动画……”嗯,这听起来像 CAAnimationGroup。

https://developer.apple.com/library/ios/documentation/graphicsimaging/reference/CAAnimationGroup_class/Introduction/Introduction.html

CAAnimationGroup 要求您执行显式图层动画,而不是视图动画。但是您正在制作显式图层动画,所以一切就绪。

【讨论】:

看看我讨论这个话题的第一个例子:apeth.com/iOSBook/ch17.html#_grouped_animations我旋转一个箭头,然后摆动箭头 - 两个完全不同的动画依次. 动画组仅在组中的所有动画都应用于同一层时才有效。

以上是关于如何同步几个不同图层的 CAKeyframeAnimation 动画?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:在两个不同的图层上同步动画

如何将origin多个图层的图例放到一个图上

AE中如何将一个图层设置为另一个图层的遮罩层

在Arcmap中如何创建地图图层

如何优化多个全屏透明 iPhone OpenGL ES 图层的绘制?

ArcGIS server10.1如何动态添加栅格图层