Я пытаюсь сделать таймер с круглым индикатором выполнения, используя CABasicAnimation, например: введите описание изображения здесь
Но по какой-то причине индикатор выполнения всегда заполнялся задолго до того, как таймер действительно закончился. Разница между индикатором выполнения и таймером всегда зависит от продолжительности таймера.
Вот мой код для таймера:
@IBOutlet var timerContainer: UIView!
@IBOutlet var timerLabel: UILabel!
var minutes = 0
var seconds = 30
var timer = Timer()
let shapeLayer = CAShapeLayer()
func displayTimer() {
if seconds < 10 {
timerLabel.text = "\(minutes):0\(seconds)"
}
else {
timerLabel.text = "\(minutes):\(seconds)"
}
}
@objc func timerTick() {
seconds -= 1
if seconds <= 0 && minutes == 0 {
timer.invalidate()
}
else {
if seconds == -1 {
minutes -= 1
seconds = 59
}
}
displayTimer()
}
override func viewDidLoad() {
super.viewDidLoad()
displayTimer()
let circularPath = UIBezierPath(arcCenter: timerContainer.center, radius: 35, startAngle: -CGFloat.pi / 2, endAngle: 2 * CGFloat.pi, clockwise: true)
let trackLayer = CAShapeLayer()
trackLayer.path = circularPath.cgPath
trackLayer.strokeColor = UIColor.lightGray.cgColor
trackLayer.lineWidth = 5
trackLayer.fillColor = UIColor.clear.cgColor
shapeLayer.path = circularPath.cgPath
shapeLayer.strokeColor = UIColor.red.cgColor
shapeLayer.lineWidth = 5
shapeLayer.fillColor = UIColor.clear.cgColor
shapeLayer.strokeEnd = 0
shapeLayer.lineCap = .round
view.layer.addSublayer(trackLayer)
view.layer.addSublayer(shapeLayer)
}
@IBAction func start() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.timerTick), userInfo: nil, repeats: true)
let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
basicAnimation.toValue = 1
basicAnimation.fillMode = .forwards
basicAnimation.duration = CFTimeInterval(minutes * 60 + seconds)
basicAnimation.isRemovedOnCompletion = false
shapeLayer.add(basicAnimation, forKey: "begin")
}
Любые мысли о том, как это исправить или почему это происходит?