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
когда приложение возвращается из фона. Я подозреваю, что нечто подобное происходит здесь.