Как настроить мою цепочку Gesture Responder с представлениями: «Swipeable» UITabBarController -> UIViewController -> PageViewController - PullRequest
1 голос
/ 27 апреля 2019

У меня возникла проблема с попыткой настроить цепочку респондентов для жестов

Я пришел из Cocoa / macOS & Mouse Events, и концепция жестов меня сбила с толку

Основаны на предположенияхв моем исследовании:

  • Вместо того, чтобы события мыши передавались в NSResponders, есть события Tap, Press и Gesture.Нажмите и нажмите, чтобы получить UIResponders, Жесты передаются GestureRecognizers (принадлежит UIView)

  • Разница между touchBegan / touchMoved / touchEnded и распознавателем жестов зависитна скорость пальца?( uigesturerecognizers-против-touchesbegan-touchesmoved-touchesended-точность ).Поэтому, если вы нажмете и медленно переместитесь, базовый UIView получит события touchMoved.Если вы быстро нажмете и перетащите, жест будет создан и передан в GestureRecognizer базового UIView. Я не совсем уверен в этом вопросе, поэтому я открываю еще один вопрос для решения этой проблемы

  • Когда я говорю «проведите пальцем влево», я имею в виду противоположное направлениетвой палец уходит, а я имею ввиду левый как в направлении навигационной анимации.то же самое с «проведением вправо».

У меня проблема с тем, что мои "Жесты" не отправляются в устройства распознавания жестов, которые я хотел бы.(Первоначально я думал, что жесты перешли к контроллерам, но с тех пор я узнал, что это не так, и GestureRecognizer принадлежат представлениям)

Иерархия представлений:

  • «Swipeable» UITabBarController ( SwipeableTabBarController )
    • UIViewController
    • UIViewController
    • UIViewController (UIView_InueULL))
      • CollectionViewController (CollectionView)

Итак, вот что я пытаюсь сделать:

  • Если вы проведете пальцем по экрану в любом месте, вы будете перемещаться между 3 UIViewControllers (Спасибо SwipeableTabBarController)
  • Если вы проведете пальцем вправо по третьему крайнему правому UIViewController,вы на самом деле пролистаете страницы PageViewController)
  • Если вы проведете пальцем влево на третьем UIViewController (который содержит PageViewController), и вы окажетесь на самой левой странице PageViewController, вы идете налево во второй (средний)UIViewController

Однако ,

  • После перехода к крайнему правому UIViewController все жесты смахивания используютсяUIQueueingScrollView на UIPageViewController.Это означает, что как только вы окажетесь в крайнем правом виде, вы не сможете провести пальцем назад влево к среднему виду.Смахивание просто переворачивается между страницами, (и в случае нахождения на левой странице ничего не происходит)

  • Я вручную перечислил по подпредставлениям, чтобы найти это UIQueueingScrollView, и удалил все GestureRecognizers от него, и это позволяет жестам передаваться до SwipeableTabBarController, так что вы можете провести назад к среднему виду ... Но это, конечно, нарушает прокрутку UIPageViewController

Моя цель:

Каким-то образом изменить GestureRecognizer в UIPageViewController (похоже, я должен сделать это на _UIQueueingScrollView), так что

  • если вы смотрите на крайнюю левую страницу:

    • выполните жест смахивания влево:
      • будет передано в GestureRecognizer вSwipeableTabBarController.Основные UIViewControllers поменяются местами
    • и проведут пальцем вправо:
      • будет передано GestureRecognizers в UIQueueingScrollView, и просмотр страницы перевернется на следующую страницу
  • иначе, если вы смотрите на любую другую страницу:

    • все жесты смахивания, переданные на UIQueueingScrollView

Мое самое большое зависание в том, что я не могу просто переопределить приемники жестов, мне нужно создавать новые пользовательские GestureRecognizer и вручную прикреплять их к моим представлениям ... но тогда я нене знаю, как эти новые пользовательские GestureRecognizer передают жесты вверх по иерархии представления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...