Перезапустите UIViewPropertyAnimator при возвращении в приложение.

Я только что создал приложение для iOS с простой анимацией. Но я борюсь с UIViewPropertyAnimator. Я хочу анимировать кнопку, и это работает хорошо, пока я не выйду из приложения (нажав кнопку «Домой») и не вернусь к нему. Анимация остановилась и больше не запускается. Я попытался остановить анимацию и запустить ее снова после того, как ViewController сделал BecomeActive, но это тоже не работает.

Запускаю анимацию в методе 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)  
}

Надеюсь, вы, ребята, знаете, как решить эту проблему. Заранее спасибо.


person Henrik    schedule 29.01.2020    source источник


Ответы (1)


Что вы можете сделать, так это сделать 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()
}

Вы также можете добавить анимацию к самому инициализатору, но, поскольку мы добавляем его перед каждым вызовом start, я думаю, что это чище.

person liquid    schedule 30.01.2020