Как сделать так, чтобы CAKeyframeAnimation можно было воспроизводить?

#swift #cakeyframeanimation

Вопрос:

Я строю индикатор выполнения круга в Swift. Следующий код работает для анимации круглой точки над клавиатурой:

У меня есть слой трека, по которому перемещаются индикатор выполнения и окружность:

 /// Track layer
    view.layer.addSublayer(trackLayer)
    let trackPath = UIBezierPath(arcCenter: center, radius: 90, startAngle: 2.7, endAngle: 0.45, clockwise: true)
    
    trackLayer.fillColor = UIColor.clear.cgColor
    trackLayer.lineCap = CAShapeLayerLineCap.round
    trackLayer.path = trackPath.cgPath
    trackLayer.strokeColor = UIColor.lightGray.cgColor
    trackLayer.lineWidth = 10
    trackLayer.lineCap = CAShapeLayerLineCap.round
    
    /// Progress bar layer
    let circularPath = UIBezierPath(arcCenter: center, radius: 90, startAngle: 2.7, endAngle: 0.45, clockwise: true)
    
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.path = circularPath.cgPath
    shapeLayer.strokeColor = UIColor.systemPink.cgColor
    shapeLayer.lineWidth = 10
    shapeLayer.strokeEnd = 0
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineCap = CAShapeLayerLineCap.round
    
    view.layer.addSublayer(shapeLayer)
    
    
    /// Circle nob layer
    let circleNobImage = UIImage(named: "whiteCircle.png")!
    
    circleNobLayer.contents = circleNobImage.cgImage
    circleNobLayer.bounds = CGRect(x: 0.0, y: 0.0, width: circleNobImage.size.width, height: circleNobImage.size.height)
    
    view.layer.addSublayer(circleNobLayer)
    
    circleNobLayer.position = CGPoint(x: 130, y: 290)

    circleNobLayer.opacity = 1
 

Затем я начинаю анимацию с этого:

 func startAnimation() {
    let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
    basicAnimation.toValue = 1
    basicAnimation.duration = seconds
    basicAnimation.fillMode = CAMediaTimingFillMode.forwards
    basicAnimation.isRemovedOnCompletion = false
    shapeLayer.add(basicAnimation, forKey: "basicAnime")

    let dotAnimation = CAKeyframeAnimation(keyPath: "position")
    dotAnimation.path = trackLayer.path
    dotAnimation.calculationMode = .paced
    
    let dotAnimationGroup = CAAnimationGroup()
    dotAnimationGroup.duration = seconds
    
    dotAnimation.autoreverses = false
    dotAnimationGroup.fillMode = .forwards
    dotAnimationGroup.isRemovedOnCompletion = false
    dotAnimationGroup.animations = [dotAnimation]
    circleNobLayer.add(dotAnimationGroup, forKey: nil)
}
 

Я приостанавливаю, возобновляю и сбрасываю анимацию с помощью этого:

 func pauseLayer(layer: CALayer){
    let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), from: nil)
    layer.speed = 0.0
    layer.timeOffset = pausedTime
}

func resumeAnimation(layer: CALayer){
    let pausedTime = layer.timeOffset
    layer.speed = 1.0
    layer.timeOffset = 0.0
    layer.beginTime = 0.0
    let timeSincePause = layer.convertTime(CACurrentMediaTime(), from: nil) - pausedTime
    layer.beginTime = timeSincePause
}

func resetAnimation() {
    timer.invalidate()
    circleNobLayer.removeAllAnimations()
    shapeLayer.removeAllAnimations()
}
 

Проблема, с которой я сталкиваюсь, заключается в том, что после сброса анимации слой circleNobLayer больше не анимируется, как это делает слой формы.

Какие изменения мне нужно внести, чтобы решить эту проблему?