在没有将isRemovedOnCompletion设置为false的情况下保留动画的stokeEnd变化

时间:2019-07-10 05:18:56

标签: ios swift cashapelayer

我有一个动画的进度圈。我可以按下一个按钮,它的动画效果为20%,如果再次按下该按钮,它的动画效果为40%。我将isRemovedOnCompletion设置为false。但是,每次执行动画时,都会将新动画添加到CAShapelayer中。我想这对性能不好。有更好的方法吗?

虚拟代码:

@IBAction func didTapAnimate(_ sender: Any) {
        let animateStroke = CABasicAnimation(keyPath: "strokeEnd")
        animateStroke.fromValue = index > 0 ? progressPts[index - 1] : 0
        animateStroke.toValue = progressPts[index]
        animateStroke.duration = 2.0
        animateStroke.fillMode = .forwards
        animateStroke.isRemovedOnCompletion = false
        circleLayer.add(animateStroke, forKey: "MyAnimation")
        index+=1
    }

2 个答案:

答案 0 :(得分:2)

我认为无需删除先前的动画,因为据我所知,只有一个动画层用于单个键,因此动画会自动替换为先前的动画。

  

一个标识动画的字符串。每个唯一动​​画只有一个动画   密钥已添加到图层。特殊密钥kCATransition为   自动用于过渡动画。您可以指定nil为   此参数。

因此,只有最后一个动画会占用内存,而先前的动画会自动释放。

答案 1 :(得分:0)

只需调用removeAnimation(forKey:"yourkey")

从circleLayer中删除先前的动画
@IBAction func didTapAnimate(_ sender: Any) {
        circleLayer.removeAnimation(forKey: "MyAnimation")
        let animateStroke = CABasicAnimation(keyPath: "strokeEnd")
        animateStroke.fromValue = index > 0 ? progressPts[index - 1] : 0
        animateStroke.toValue = progressPts[index]
        animateStroke.duration = 2.0
        animateStroke.fillMode = .forwards
        animateStroke.isRemovedOnCompletion = false
        circleLayer.add(animateStroke, forKey: "MyAnimation")
        index+=1
    }