CABasicAnimation завершает работу намного быстрее, чем таймер - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь сделать таймер с круглым индикатором выполнения, используя 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")
    
}

Любые мысли о том, как это исправить или почему это происходит?

1 Ответ

0 голосов
/ 09 июля 2020

Похоже, что ваш ar c изменяется от -π / 2 до 2π. Это больше, чем полный круг. Я подозреваю, что он обрезается до полного круга 2π.

Разве ваш ar c go от -π / 2 до 3π / 2 не должен давать вам полный круг, начинающийся с π / 2?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...