我有一个每1.0秒发射一次的计时器。每次触发时,TimeInterval变量都设置为Date.timeSinceReferenceDate,当我暂停计时器时,另一个TimeInterval变量也会被设置为Date.timeSinceReferenceDate并且计时器无效。
当我再次按下开始按钮时,我希望它从停止的位置恢复(即如果你再次开始前0.5秒暂停,恢复时需要0.5秒才能触发,而不是1.0目前确实如此)。
以下是我的代码的外观:
if (elapsedTime - beginTime) < 1.0 {
leftoverTime = elapsedTime - beginTime
timer = Timer.scheduledTimer(timeInterval: leftoverTime, target: self, selector: #selector(decreaseTime), userInfo: nil, repeats: false)
let fireDate = Date().addingTimeInterval(leftoverTime)
timer = Timer.init(fireAt: fireDate, interval: 1.0, target: self, selector: #selector(decreaseTime), userInfo: nil, repeats: true)
}
我想我需要使用Run Loop做一些事情,但是有没有办法只做一个带有开火日期的预定计时器?如果我使用fire()方法,它自然只会运行一次并且不会循环。
希望有人可以对此有所启发。
谢谢。
修改
我有一个UIViewPropertyAnimator
var animator: UIViewPropertyAnimator? = nil
当我启动计时器时,我首先检查它是否为
animator == nil {
animator = UIViewPropertyAnimator(duration: TimeInterval(timeSec), curve: .linear) {
self.view.layoutIfNeeded()
}
}
然后计时器最初启动
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(decreaseTime), userInfo: nil, repeats: true)
在减少时间的方法中,我改变约束并开始动画
self.timeTrailing.constant = screenSize / 2
self.timeLeading.constant = screenSize / 2
animator?.startAnimation()
此时它一切都很好,但是当我按下暂停按钮并暂停动画(并使计时器无效)时,恢复它们意味着它们不再同步。我想象一下,因为按下它时你不会达到0.1的间隔,而是0.03,0.07等。
animator?.pauseAnimation()
timer?.invalidate()
我如何确保他们始终同步,无论您何时以及在完成之前暂停多少次?