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

Posted

技术标签:

【中文标题】使用 CAShapeLayer 创建的动画圆的 CAGradientLayer 问题【英文标题】:CAGradientLayer issues for animated circle created using CAShapeLayer 【发布时间】:2015-05-12 12:33:48 【问题描述】:

我正在使用 UIBezierPath 和 CAShapeLayer 绘制一个动画圆圈。现在,在添加渐变效果时,出现的问题是 - CAGradientLayer 从颠倒添加它的渐变效果。但是我想要从圆的起点到圆的终点的渐变效果。

我得到的是 -

我的代码是 - (它是一个函数)

 circle.path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(radius+6,radius+6)  radius:radius startAngle:DEGREES_TO_RADIANS(startAngle) endAngle:DEGREES_TO_RADIANS(endAngle) clockwise:isClockWise].CGPath;

    //circle.position = CGPointMake(CGRectGetMidX(self.frame)-radius, CGRectGetMidY(self.frame)-radius);

    circle.fillColor = fillColor.CGColor;
    circle.strokeColor = strokeColor.CGColor;
    circle.lineWidth = lineWidth;
    circle.strokeEnd = percentToDraw/100;
    circle.lineCap = kCALineCapRound;

    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.startPoint = CGPointMake(0.5,1.0);
    gradientLayer.endPoint = CGPointMake(0.5,0.0);
    gradientLayer.frame = CGRectMake(0, 0, self.frame.size.width , self.frame.size.height);
    NSMutableArray *colors = [NSMutableArray array];
    [colors addObject:(id)[UIColor blackColor].CGColor];
    [colors addObject:(id)strokeColor.CGColor];

    gradientLayer.colors = colors;
    [gradientLayer setMask:circle];

    [self.layer addSublayer:gradientLayer];

    CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    drawAnimation.duration            = duration;
    drawAnimation.repeatCount         = 1.0;

    drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
    drawAnimation.toValue   = [NSNumber numberWithFloat:percentToDraw/100];

    drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

    [circle addAnimation:drawAnimation forKey:@"drawCircleAnimation"];

如何添加渐变,使其开始(红色)并前进到终点(黑色)。 ?

【问题讨论】:

恐怕我没有答案,但我知道渐变从矩形的一个边缘开始,随着它们靠近另一边缘慢慢改变颜色。这正是这里发生的事情,只是你用圆形路径掩盖了它。我不完全确定这可以通过 CAGradientLayer 实现。虽然如果您将矩形分成象限并为每个象限应用不同的渐变,这可能是可能的。 【参考方案1】:

假设您谈论的是锥形/角度渐变,那么没有系统提供的方法可以通过 CAGradientLayer 实现该目标。有一些库(例如 AngleGradientLayer)试图提供此功能,但是,与任何第 3 方解决方案一样,应谨慎使用它。

您还可以查看here 或here 讨论的方法,但是它们需要您稍微重构您的逻辑。

请注意,此建议仅适用于循环情况。

【讨论】:

以上是关于使用 CAShapeLayer 创建的动画圆的 CAGradientLayer 问题的主要内容,如果未能解决你的问题,请参考以下文章

CAShapeLayer的缩放动画问题[重复]

CAShapeLayer shadowPath 动画。如何防止动画完成时的阴影填充?

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

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

如何使用 CAShapeLayer 使我的 UIBezierPath 动画?

为啥我的 CAShapeLayer 无法使用 UIView(带 gif)正确设置动画?