#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 больше не анимируется, как это делает слой формы.
Какие изменения мне нужно внести, чтобы решить эту проблему?