使用UIViewPropertyAnimator暂停和恢复约束动画

时间:2017-01-31 16:04:31

标签: ios swift

我有一个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)

希望有人可以了解我需要做些什么来使其发挥作用。

提前致谢。

1 个答案:

答案 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()
    }
}