CAShapeLayer动画路径毛刺/闪烁(从椭圆到矩形和背面)

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

在我的canvas控制器中,我设置了一个基本的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]; 

我尝试了许多不同的东西,比如锁定/解锁CATransaction,玩各种填充模式等等……

这是故障的图像: http : //www.postfl.com/outgoing/renderingglitch.png

可以在此处找到我正在体验的video: http : //vimeo.com/37720876

不幸的是,这是CAShapeLayers的其他令人敬畏的动画路径属性的限制。

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

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

你可能能够在那里获得大部分,然后转移到最后一部分的淡入淡出动画 – 但这看起来并不好看。

我收到了来自quartz-dev列表的反​​馈:

David Duncan写道:

动画形状图层的路径只能保证在您喜欢动画时动画。 矩形是一系列线,而椭圆是一系列弧(您可以看到使用CGPathApply生成的序列),因此它们之间的动画不能保证看起来很好,或者根本不能正常工作。

要做到这一点,你基本上必须使用与创建椭圆相同的曲线来创建矩形的模拟,但是使用的参数会导致渲染看起来像一个矩形。 这应该不会太困难(同样,您可以使用从CGPathAddEllipseInRect创建的路径上的CGPathApply获得的内容作为指导),但可能需要进行一些调整才能正确。