如何同步2个不同图层的动画

时间:2013-10-08 21:48:26

标签: ios core-animation

我有一个UIView,其图层有2个子图层,一个是CAShapeLayer,另一个是CALayer。

CAShapeLayer使用bezierPathWithOvalInRect设置路径,并使用CABasicAnimation进行动画处理。 “strokeEnd”属性在一定时间内从0.0到1.0动画。这具有在持续时间内从头到尾看到椭圆形绘制的效果。

CALayer只将其内容设置为铅笔图像,并使用CAKeyframeAnimation进行动画处理。通过将CAKeyframeAnimation的path属性设置为与CAShapeLayer相同的路径来设置“position”属性,并将其设置为与CABasicAnimation相同的持续时间。这具有铅笔在相同持续时间内沿同一路径移动的效果,看起来铅笔正在绘制椭圆形。

在iOS6中精美地运作。然而,在iOS7中,时间关闭 - 位置和strokeEnd动画不同步 - 它们在特定时刻同步,特别是在时间0,持续时间/ 4,持续时间/ 2,持续时间* 3/4和持续时间 - 但在两者之间,同步已关闭。

如果不使用椭圆,我使用矩形或三角形,例如,它在iOS6和iOS7中运行良好。在iOS7中,只有问题是椭圆。

基本上我需要知道如何同步2个不同的动画,其中每个动画都为不同的动画设置动画。

以下是创建2层的代码:

self.drawingLayer = [CAShapeLayer layer];
self.drawingLayer.frame = self.view.bounds;
self.drawingLayer.bounds = drawingRect;
self.drawingLayer.path = path.CGPath;
self.drawingLayer.strokeColor = [[UIColor blackColor] CGColor];
self.drawingLayer.fillColor = nil;
self.drawingLayer.lineWidth = 10.0f;
self.drawingLayer.lineJoin = kCALineJoinRound;
self.drawingLayer.lineCap = kCALineJoinRound;

[self.view.layer addSublayer:self.drawingLayer];

UIImage *pencilImage = [UIImage imageNamed:@"pencil.png"];
self.pencilLayer = [CALayer layer];
self.pencilLayer.contents = (id)pencilImage.CGImage;
self.pencilLayer.contentsScale = [UIScreen mainScreen].scale;
self.pencilLayer.anchorPoint = CGPointMake(0.0, 1.0); //bottom left corner
self.pencilLayer.frame = CGRectMake(0.0f, 0.0f, 100.0f, 100.0f);

[self.view.layer addSublayer:self.pencilLayer];

这是创建和启动2个不同动画的代码(self.drawingLayer是CAShapeLayer,self.pencilLayer是CALayer)

CABasicAnimation *drawingAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
drawingAnimation.duration = 10.0;
drawingAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
drawingAnimation.toValue = [NSNumber numberWithFloat:1.0f];
[self.drawingLayer addAnimation:drawingAnimation forKey:@"strokeEnd"];

CAKeyframeAnimation *pencilAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pencilAnimation.duration = drawingAnimation.duration;
pencilAnimation.path = self.drawingLayer.path;
pencilAnimation.calculationMode = kCAAnimationPaced;
pencilAnimation.delegate = self;
pencilAnimation.fillMode = kCAFillModeForwards;
pencilAnimation.removedOnCompletion = NO;
[self.pencilLayer addAnimation:pencilAnimation forKey:@"position"];

更新

这是一个说明问题的测试应用程序。

https://github.com/xjones/AnimatedPaths

2 个答案:

答案 0 :(得分:5)

Apple告诉我这是iOS7中的已知错误,他们还要求我提交一个错误,以帮助他们了解修复的需求。 Apple的技术支持人员告诉我他不知道解决方法。如果你们中的任何一个人找到了解决方法,我会全力以赴......

答案 1 :(得分:0)

我于2013年10月9日提交了Apple bug报告错误#15191834。在我使用iOS 8.1和Xcode 6.1.1进行的测试中,该模拟器和设备中的错误仍然存​​在。该错误是在iOS 7中引入的,从未修复过。

请提交一个错误,以便Apple可以看到其他人受到影响!

相关问题