4

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

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

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

在 iOS6 中运行良好。但是,在 iOS7 中,计时是关闭的 - position 和 strokeEnd 动画不同步 - 它们在特定时刻是同步的,特别是在时间 0、duration/4、duration/2、duration*3/4 和 duration -但在这两者之间,同步关闭。

例如,如果不是椭圆,而是使用矩形或三角形,它在 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

4

2 回答 2

5

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

于 2013-10-10T15:15:46.643 回答
0

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

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

于 2014-12-29T19:11:31.403 回答