我有一个 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"];
更新
这是一个说明问题的测试应用程序。