动画在Swift中绘制圆圈的奇怪问题

时间:2017-10-21 13:02:20

标签: ios swift animation uibezierpath cashapelayer

我正在尝试使用以下方式绘制圆圈:

func drawProgressCircle(with endAngle: CGFloat) {
    let progressBezierPath = UIBezierPath(arcCenter: CGPoint(x: self.frame.width / 2, y: self.frame.width / 2), radius: self.frame.width / 2.5, startAngle: -CGFloat(Double.pi / 2), endAngle: endAngle, clockwise: true)
    let progressShapeLayer = CAShapeLayer()
    progressShapeLayer.path = progressBezierPath.cgPath

    progressShapeLayer.strokeColor = UIColor.brown.cgColor
    progressShapeLayer.fillColor = UIColor.clear.cgColor
    progressShapeLayer.lineWidth = 15.0

    // Do not draw initially. Wait for animation
    progressShapeLayer.strokeEnd = 0.0

    // Make corners rounded
    progressShapeLayer.lineCap = kCALineCapRound

    self.layer.addSublayer(progressShapeLayer)
    self.animate(circleWith: progressShapeLayer, from: -CGFloat(Double.pi / 2), to: endAngle, with: 2.0)
}

并为其设置动画我称之为此功能:

func animate(circleWith shapeLayer: CAShapeLayer, from: CGFloat, to: CGFloat, with duration: TimeInterval) {
    // We want to animate the strokeEnd property of the circleLayer
    let animation = CABasicAnimation(keyPath: "strokeEnd")

    // Set the animation duration appropriately
    animation.duration = duration

    // Animate from start point to end point
    animation.fromValue = from
    animation.toValue = to

    // Do a linear animation (i.e. the speed of the animation stays the same)
    animation.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)

    // Set the circleLayer's strokeEnd property to 1.0 now so that it's the
    // right value when the animation ends.
    shapeLayer.strokeEnd = 1.0

    // Do the actual animation
    shapeLayer.add(animation, forKey: "animate")
}

但我不知道为什么它没有动画。画布是空的,在2秒内它就会出现在画布上。没有任何动画。

有什么问题?为什么它没有动画画?

1 个答案:

答案 0 :(得分:1)

替换动画formValue& toValue by:

// Animate from start point to end point
animation.fromValue = 0
animation.toValue = 1

基本上,keyPath CABasicAnimation的{​​{1}}并不知道您正在绘制一个圆圈,它只是从0到1的动画。 如果你给stroke一个0.5的值,它只会动画到路径的一半。

它与keyPath toValue的{​​{1}}不同,后者将CGPoint用于CABasicAnimationposition