Я использую UIViewPropertyAnimator
для создания небольших contentOffset
анимаций.
Чтобы сохранить мой контроллер вида, у меня есть код анимации в подклассе UIScrollView
, который должен быть анимирован. Первоначально я делал анимацию в блоке UIView.animate
, но заметил, что когда вид исчезает (т.е. другой вид помещается поверх вида), анимация переходит к концу, поэтому я пытаюсь реализовать паузу в анимации. , Кроме того, я хотел уменьшить нагрузку на процессор за счет ненужных вызовов анимации.
var animator: UIViewPropertyAnimator?
...
func showAnimation() {
...
if animator == nil {
animator = UIViewPropertyAnimator(duration: duration, curve: .linear, animations: { [unowned self] in
self.contentOffset = endPoint
})
animator?.addCompletion { [unowned self] (position) in
if position == .end {
self.afterAnimation()
print("completion called")
}
}
}
}
func pauseAnimation() {
if animator?.state == .active {
animator?.pauseAnimation()
}
print("paused animation")
}
Метод afterAnimation()
просто определяет, будет ли showAnimation()
вызываться снова или нет.
В моем контроллере вида у меня в основном есть следующее:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
myScrollView.showAnimation()
}
override func viewWillDisappear(_ animated: Bool) {
viewWillDisappear(animated)
myScrollView.pauseAnimation()
}
Теперь это работает хорошо, пока пользователь не остается на другом экране слишком долго.
Например, если пользователь вызывает экран настроек (который выдвигается на
навигационный стек) вызывается метод паузы - как и ожидалось. Если пользователь остается
на этом экране слишком долго, тогда вызывается метод завершения аниматора, хотя
анимация не завершена. Как только пользователь снова закрывает экран настроек,
анимация заморожена и не продолжается.
Я также пытался работать с
animator = UIViewPropertyAnimator.runningPropertyAnimator(withDuration: duration, delay: 0, options: .curveLinear, animations: { [unowned self] in
self.contentOffset = endPoint
print("starting animation")
}) { [unowned self] _ in
self.afterAnimation()
print("completion called")
}
но результаты были такими же. Через некоторое время вызывается блок завершения.
Как мне лучше всего решить эту проблему? Спасибо!
РЕДАКТИРОВАТЬ: Через различные операторы печати у меня постепенно возникает мысль, что даже когда animator
приостанавливается, внутренний счетчик анимации продолжается и вызывает блок завершения, когда анимация должна быть закончена.