返回 App 时重启 UIViewPropertyAnimator

Restart UIViewPropertyAnimator when returning to the App

我刚刚构建了一个带有简单动画的 iOS 应用程序。但是我正在为 UIViewPropertyAnimator 苦苦挣扎。我想为一个按钮制作动画,并且在我离开应用程序(按下主页按钮)并返回之前效果很好。动画已经停止,不会重新开始。我试图停止动画并在 ViewController didBecomeActive 之后再次启动它,但这也不起作用。

我在viewDidAppear方法中启动动画如下:

var animator: UIViewPropertyAnimator!

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), name: UIApplication.didBecomeActiveNotification,object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeInActive), name: UIApplication.willResignActiveNotification,object: nil)

        //Start Animation
        animator = UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 1, delay: 0, options: [.autoreverse, .repeat], animations: {
            UIView.setAnimationRepeatAutoreverses(true)
            UIView.setAnimationRepeatCount(1000)
            self.scanButton.transform = CGAffineTransform(scaleX: 0.95, y: 0.95)
        }, completion: nil)
        animator.startAnimation()
    }

这里是我停止和重新启动动画的代码:

@objc func applicationDidBecomeActive() {
        print("Active")
        animator.startAnimation()
}

@objc func applicationDidBecomeInActive() {
        print("InActive")
        animator.stopAnimation(true)
        animator.finishAnimation(at: .current)  
}

我希望你们知道如何解决这个问题。 提前致谢。

你可以做的是使用它的任何一个初始化器使 animator 成为一个实例 属性:

private var animator = UIViewPropertyAnimator(duration: 1, curve: .linear, animations: nil)

这将允许您使用 addAnimations() 向它重新添加动画,这是我们想要做的,因为动画本身在每次启动动画的调用结束时被取消。因此,在调用startAnimation()之前,我们必须始终给它动画(通常每次都是相同的)。

@objc func applicationDidBecomeActive() {
    print("Active")
    animator.addAnimations {
        // re-add animation
    }
    animator.startAnimation()
}

您也可以将动画添加到初始化程序本身,但由于我们是在每次调用开始之前添加它,所以我认为这样更简洁。