Реакция на сенсорные события во время анимации представления контроллера представления

В моем приложении для iOS у меня есть представление Toast, которое работает так же, как всплывающие уведомления на Android. Когда произносится тост, он отображается в небольшой области экрана в течение нескольких секунд, после чего автоматически исчезает. У тостов есть два основных свойства:

  1. Пока тост отображается на экране, пользователь может перемещаться по приложению, как он привык.
  2. Тост является липким, что означает, что он остается на экране в течение указанного времени, несмотря ни на что (даже при нажатии, выталкивании, представлении и закрытии других контроллеров представления).

Для достижения «липкости» тосты представлены в подклассе UIWindow. В частности, я вызываю present(toastViewController, animated: true, completion: nil) в контроллере корневого представления пользовательского окна, который представляет тост с помощью пользовательской анимации, которую я реализовал с помощью UIViewPropertyAnimator в сочетании с UIViewControllerTransitioningDelegate и UIViewControllerAnimatedTransitioning. Поскольку окно заполняет весь экран, я переопределил его метод point(inside point: CGPoint, with event: UIEvent?), чтобы он всегда возвращал false. Это распространяет события касания в ключевое окно, содержащее фактический интерфейс под всплывающим уведомлением.

Это прекрасно работает, когда всплывающие уведомления отображаются на экране, но (и в этом проблема) пользовательский интерфейс в ключевом окне зависает, пока всплывающее уведомление анимируется на экране и за его пределами. Это означает, что если пользователь прокручивает табличное представление, когда всплывающее уведомление закрывается, пользовательский интерфейс зависает примерно на 0,5 секунды.

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


person wstr    schedule 10.12.2019    source источник


Ответы (1)


Вы можете просмотреть всплывающее уведомление как представление в окне. также вы можете использовать CGAfflineTransform для анимации.

person Vishnu    schedule 10.12.2019