Ios CAShapeLayer动画路径故障/闪烁(从椭圆到矩形再到背面)

Ios CAShapeLayer动画路径故障/闪烁(从椭圆到矩形再到背面),ios,core-animation,cgpath,cabasicanimation,Ios,Core Animation,Cgpath,Cabasicanimation,当我创建一个显式动画以将CAShapeLayer的路径值从椭圆更改为矩形时,我遇到了一个问题 在我的画布控制器中,我设置了一个基本的CAShapeLayer,并将其添加到根视图的层中: CAShapeLayer *aLayer; aLayer = [CAShapeLayer layer]; aLayer.frame = CGRectMake(100, 100, 100, 100); aLayer.path = CGPathCreateWithEllipseInRect(aLayer.frame,

当我创建一个显式动画以将CAShapeLayer的路径值从椭圆更改为矩形时,我遇到了一个问题

在我的画布控制器中,我设置了一个基本的CAShapeLayer,并将其添加到根视图的层中:

CAShapeLayer *aLayer;
aLayer = [CAShapeLayer layer];
aLayer.frame = CGRectMake(100, 100, 100, 100);
aLayer.path = CGPathCreateWithEllipseInRect(aLayer.frame, nil);
aLayer.lineWidth = 10.0f;
aLayer.strokeColor = [UIColor blackColor].CGColor;
aLayer.fillColor = [UIColor clearColor].CGColor;
[self.view.layer addSublayer:aLayer];
然后,当我为路径设置动画时,在动画的最后几帧中,当形状变为矩形时,以及在动画的前几帧中,当形状不再是矩形时,我会出现奇怪的小故障/闪烁。动画设置如下所示:

CGPathRef newPath = CGPathCreateWithRect(aLayer.frame, nil);
[CATransaction lock];
[CATransaction begin];
[CATransaction setAnimationDuration:5.0f];
CABasicAnimation *ba = [CABasicAnimation animationWithKeyPath:@"path"];
ba.autoreverses = YES;
ba.fillMode = kCAFillModeForwards;
ba.repeatCount = HUGE_VALF;
ba.fromValue = (id)aLayer.path;
ba.toValue = (__bridge id)newPath;
[aLayer addAnimation:ba forKey:@"animatePath"];
[CATransaction commit];
[CATransaction unlock];
我尝试过很多不同的方法,比如锁定/解锁CATTransaction,玩各种填充模式,等等

以下是该故障的图像:

我正在经历的视频可以在这里找到:

不幸的是,这是CAShapeLayers的其他可设置动画的路径属性的一个限制

基本上,它尝试在两条路径之间插值。当目标路径和起始路径具有不同数量的控制点时,会遇到问题,曲线和直边也会出现此问题

您可以尝试通过将椭圆绘制为4条曲线而不是单个椭圆来最小化效果,但它仍然不太正确。我还没有找到从曲线到多边形平滑过渡的方法


您可能能够在大部分情况下到达那里,然后转移到最后一部分的淡入淡出动画-尽管这看起来不太好

不幸的是,这是CAShapeLayers的其他可设置动画的路径属性的限制

基本上,它尝试在两条路径之间插值。当目标路径和起始路径具有不同数量的控制点时,会遇到问题,曲线和直边也会出现此问题

您可以尝试通过将椭圆绘制为4条曲线而不是单个椭圆来最小化效果,但它仍然不太正确。我还没有找到从曲线到多边形平滑过渡的方法


您可能能够在大部分情况下到达那里,然后转移到最后一部分的淡入淡出动画-尽管这看起来不太好

我从quartz开发者列表中收到了以下反馈:

大卫·邓肯写道:

仅在以下情况下才能保证对形状层的路径设置动画: 您正在从“喜欢”到“喜欢”设置动画。矩形是一系列的矩形 直线,而椭圆是一系列圆弧(您可以看到 使用CGPathApply生成的序列),以及动画 他们之间的关系并不能保证看起来很好,或者工作得很好

要做到这一点,您基本上必须通过 使用与创建椭圆相同的曲线,但是 使用会使渲染看起来像 矩形。这应该不会太难(同样,您可以使用 您从CGPathApply获得的内容将应用于使用创建的路径 CGPathAddellipSeirect作为指南),但可能需要一些 调整以获得正确的结果


我从quartz开发人员列表中收到了以下反馈:

大卫·邓肯写道:

仅在以下情况下才能保证对形状层的路径设置动画: 您正在从“喜欢”到“喜欢”设置动画。矩形是一系列的矩形 直线,而椭圆是一系列圆弧(您可以看到 使用CGPathApply生成的序列),以及动画 他们之间的关系并不能保证看起来很好,或者工作得很好

要做到这一点,您基本上必须通过 使用与创建椭圆相同的曲线,但是 使用会使渲染看起来像 矩形。这应该不会太难(同样,您可以使用 您从CGPathApply获得的内容将应用于使用创建的路径 CGPathAddellipSeirect作为指南),但可能需要一些 调整以获得正确的结果


在你的答案和我从大卫邓肯那里发来的答案之间,我对发生的事情有很好的了解。希望在未来的版本中,动画路径属性会变得更好。如果你使用圆弧矩形的方法来解决这个问题,请在这里发布!我不知道你是否在这方面做过工作,或者在这篇文章发表后看到了什么好的答案。我开始做一个普通的圆到多边形的动画,现在有一个圆到正方形的动画。我已经发布了这段代码来回答这个问题,@rdelmar不,我已经有一段时间没做这方面的工作了。这应该比现在容易…在你的答案和我从大卫邓肯那里发布的答案之间,我对发生的事情有很好的感觉。希望在未来的版本中,动画路径属性会变得更好。如果你使用圆弧矩形的方法来解决这个问题,请在这里发布!我不知道你是否在这方面做过工作,或者在这篇文章发表后看到了什么好的答案。我开始做一个普通的圆到多边形的动画,现在有一个圆到正方形的动画。我已经发布了这段代码来回答这个问题,@rdelmar不,我已经有一段时间没做这方面的工作了。这应该比现在容易些。。。