Проблемы с приостановкой UIViewPropertyAnimation - PullRequest
0 голосов
/ 04 сентября 2018

Я использую 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 приостанавливается, внутренний счетчик анимации продолжается и вызывает блок завершения, когда анимация должна быть закончена.

...