CAShapeLayer 路径动画——缩小圆

Posted

技术标签:

【中文标题】CAShapeLayer 路径动画——缩小圆【英文标题】:CAShapeLayer path animation -- shrinking a circle 【发布时间】:2014-03-06 00:33:53 【问题描述】:

我正在尝试缩小圆形 CAShapeLayer,但使用关键路径“路径”似乎不起作用。

CGPathRef startPath = [UIBezierPath bezierPathWithOvalInRect:startRect].CGPath;
CGPathRef endPath   = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(startRect, 15, 15)].CGPath;

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"];
animation.duration          = 1.0;
animation.fromValue         = (__bridge id)startPath;
animation.toValue           = (__bridge id)endPath;
animation.autoreverses      = YES;
animation.repeatCount       = CGFLOAT_MAX;
animation.timingFunction    = [CAMediaTimingFunction functionWithControlPoints:0.6 :0.3 :0.8 :0.45];

//circleLayer is a CAShapeLayer
[self.circleLayer addAnimation:animation forKey:@"pathAnimation"];

我想我一定误解了路径动画的工作原理,因为如果我尝试制作不透明度或变换的动画,几乎相同的代码似乎可以正常工作。

有什么想法吗?

【问题讨论】:

在我的脑海中,我无法发现哪里出了问题。我以前可以让very similar code 工作。那么,您能否验证这两条路径是否合理且有效(主要验证 startRect 是否足够大,可以像那样插入)。您可以通过简单地将 endPath 分配给圆形层并验证它是否有效(没有动画)来测试它 startRect 是什么?如果小于 30x30,则插入时为 CGRectZero,因此 endPath 可能未定义。因为除此之外,一切看起来都很完美。 【参考方案1】:

我最近遇到了同样的问题,并最终通过创建圆圈来解决它,然后为比例 CGAffineTransform 设置动画。在图层为圆圈的视图中,我简单地使用了

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, scaleX, scaleY);

[UIView animateWithDuration: 0.5 animations: ^
    self.transform = transform;
];

希望这会有所帮助!

【讨论】:

以上是关于CAShapeLayer 路径动画——缩小圆的主要内容,如果未能解决你的问题,请参考以下文章

CAShapeLayer 路径动画

如何为 CAShapeLayer 路径和填充颜色设置动画

CAShapeLayer 动画路径毛刺/闪烁(从椭圆到矩形并返回)

使用 CAShapeLayer 创建的动画圆的 CAGradientLayer 问题

我正在为填充但未描边的 CAShapeLayer 的路径值设置动画,我想让它的动画更流畅

贝塞尔曲线与CAShapeLayer的关系以及Stroke动画