使用UIBezierPath动画绘制弧

我用以下方法画了一个圆弧:

- (void)drawRect:(CGRect)rect { UIBezierPath *stripePath = [UIBezierPath bezierPath]; [arcColor set]; [stripePath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:clockwise]; stripePath.lineWidth = arcWidth; stripePath.lineCapStyle = kCGLineCapRound; stripePath.lineJoinStyle = kCGLineCapRound; [stripePath stroke]; } 

现在我想以角度为这个弧设置动画。

我正在尝试这样的事情:

 angle = startAngle; [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ angle = endAngle; [stripePath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:angle clockwise:clockwise]; [stripePath stroke]; }]; 

但是,屏幕上没有显示动画。 如何使用角度作为变化变量来设置弧的动画? 谢谢。

可能MHRadialProgressView将帮助您按特定角度设置动画弧。

以下代码实现了我的目标:

 UIBezierPath *stripePath = [UIBezierPath bezierPath]; [arcColor set]; stripePath.lineWidth = arcWidth; stripePath.lineCapStyle = kCGLineCapRound; stripePath.lineJoinStyle = kCGLineCapRound; [stripePath addArcWithCenter:center radius:radius startAngle:startAngle endAngle:endAngle clockwise:clockwise]; [_stripeLayer setPath:stripePath.CGPath]; [_stripeLayer setStrokeColor:arcColor.CGColor]; [_stripeLayer setFillColor:[UIColor clearColor].CGColor]; [_stripeLayer setLineWidth:arcWidth]; [_stripeLayer setStrokeStart:0.0]; [_stripeLayer setStrokeEnd:1.0]; [_stripeLayer setLineCap:kCALineCapRound]; [_stripeLayer setLineJoin:kCALineCapRound]; if ([_stripeLayer superlayer]) { [_stripeLayer removeAllAnimations]; [_stripeLayer removeFromSuperlayer]; } [self.layer addSublayer:_stripeLayer]; CABasicAnimation *animateStrokEnd = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; animateStrokEnd.duration = 1; animateStrokEnd.fromValue = [NSNumber numberWithFloat:0.0]; animateStrokEnd.toValue = [NSNumber numberWithFloat:1.0]; [_stripeLayer addAnimation:animateStrokEnd forKey:nil]; 

下面是Swift 4版本(仅包括动画部分):

  let animation = CABasicAnimation.init(keyPath: "strokeEnd") animation.duration = 5 animation.fromValue = 0 animation.toValue = 1 circleLayer.add(animation, forKey: nil)