UIViewPropertyAnimator делает странные вещи в жизненном цикле приложения

Помогите мне выяснить, что происходит в этом сценарии:

Представьте, что у вас есть контроллер представления со следующими свойствами

@IBOutlet weak var blurView: UIVisualEffectView!
var animator: UIViewPropertyAnimator?

в viewDidLoad() ты делаешь что-то подобное

    animator = UIViewPropertyAnimator(
        duration: 1,
        curve: .easeOut,
        animations: {
            self.blurView.effect = UIBlurEffect(style: .light)
        })
    animator?.fractionComplete = 0

Чтобы увидеть эффект размытия на работе, вы должны поместить что-то позади него (например, UIImageView). У вас также есть UISlider для игры с анимацией:

@IBAction private func sliderDidChange(_ sender: UISlider) {
    animator?.fractionComplete = CGFloat(sender.value)
}

Некоторое время спустя вы кладете приложение в фоновый режим и возвращаетесь. Что вы ожидаете увидеть? По какой-то причине анимация запускается, когда вы идете в фоновом режиме, и когда вы возвращаетесь, анимация находится в своем конечном состоянии! Но я заметил, что это поведение связано с UIVisualEffectView, Если вы измените другие свойства в аниматоре (например, opacity или transform) аниматор работает, как я ожидаю (ничего не меняется, когда приложение выходит в фоновом режиме).

Я что-то пропустил или это ошибка UIKit?

1 ответ

Решение

Всякий раз, когда приложение возобновляется (например, в viewWillAppear), установите текущее состояние вашей анимации на желаемое значение.

объяснение

Как вы упомянули в своем вопросе, это больше проблема с UIVisualEffectView чем это с UIViewPropertyAnimator,

Оживить UIVisualEffectViewв интерактивном режиме размытия, альтернативное решение - приостановить анимацию слоя, установив его speed в 0 и изменение слоя timeOffset, Я упоминаю об этом, потому что у него есть побочный эффект, когда он не восстанавливается timeOffset когда приложение возвращается из фона. Я подозреваю, что нечто подобное происходит здесь.

Другие вопросы по тегам