我有一个UIImageView,可以拉伸屏幕的宽度,其尾部和前端我可以在屏幕中间设置动画。所需的时间与计时器有关。
我有一个开始按钮,也可以作为暂停按钮。 我可以让动画最初开始并暂停而没有问题,但让它从它停止的地方(甚至根本没有)再次恢复是我遇到麻烦的地方。
@IBAction func startBtnPressed(_ sender: AnyObject) {
if isStartBtnPressed == true {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(decreaseTime), userInfo: nil, repeats: true)
isStartBtnPressed = false
self.prepareTimeTrailing.constant = screenSize / 2
self.prepareTimeLeading.constant = screenSize / 2
animator = UIViewPropertyAnimator(duration: TimeInterval(timeSec), curve: .linear) {
self.view.layoutIfNeeded()
}
animator.startAnimation()
} else {
timer.invalidate()
isStartBtnPressed = true
animator.pauseAnimation()
}
}
我尝试在下面添加一段代码,但它并没有什么区别。
var animationTiming = UICubicTimingParameters.init(animationCurve: .linear)
animator.continueAnimation(withTimingParameters: animationTiming, durationFactor: 1.0)
UIView.animate(withDuration: TimeInterval(Float(timeSec)), delay: 0.0, options: [.curveLinear, .allowUserInteraction, .beginFromCurrentState], animations: {
self.view.layoutIfNeeded()
}, completion: nil)
希望有人可以了解我需要做些什么来使其发挥作用。
提前致谢。
答案 0 :(得分:3)
我认为问题是你在尝试恢复它时创建新动画。 您需要执行 startAnimation()而不创建新的动画类。我想你需要用一些这样的想法:
@IBAction func startBtnPressed(_ sender: AnyObject) {
if animator == nil{
self.prepareTimeTrailing.constant = screenSize / 2
self.prepareTimeLeading.constant = screenSize / 2
animator = UIViewPropertyAnimator(duration: TimeInterval(timeSec), curve: .linear) {
self.view.layoutIfNeeded()
}
if isStartBtnPressed == true {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(decreaseTime), userInfo: nil, repeats: true)
isStartBtnPressed = false
animator.startAnimation()
} else {
timer.invalidate()
isStartBtnPressed = true
animator.pauseAnimation()
}
}