CAAnimation is about presentation layer, after animation completes, the view snaps back to its original state. If we want to keep the state after animation, then the wrong way is to use
Animation never ends
The receiver remains visible in its final state when the animation is completed.
When true, the animation is removed from the target layer’s animations once its active duration has passed. Defaults to true.
layer.fillMode = .forwards animation. isRemovedOnCompletion = false
This is to tell the animation to never ends and keep its last presentation state. Wrong approach ❗️
Set final state before calling animation
The presentation state is just for animation, the source of truth lies in the layer itself. We need to set the final state before calling animation
let animation = CABasicAnimation(keyPath: #keyPath(CAShapeLayer.strokeEnd)) shapeLayer.strokeEnd = 1.0 shapeLayer.add(animation, forKey: "")