Как определить, происходит ли поворот страницы UIPageViewController из-за пролистывания / панорамирования или касания - PullRequest
0 голосов
/ 25 февраля 2019

При использовании UIPageViewController пользователь может провести вправо или влево, чтобы создать поворот анимированной страницы, который следует за его пальцем.Или пользователь может просто нажать на одну сторону просмотра страницы или другой, чтобы вызвать поворот страницы.Когда анимация переворачивания страницы завершена, вызывается метод делегата pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:.

Я бы хотел, чтобы состояние моей конечной страницы немного отличалось, в зависимости от того, перелистывал ли пользователь страницу или коснулся ее.,Но я не могу найти надежный способ определить, что послужило причиной переворачивания страницы.Метод pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: не предоставляет эту информацию.

В моем делегате UIPageViewController (self) вызывается метод gestureRecognizer:shouldReceiveTouch:, но он вызывается как для пролистывания (панорамирования), так и для касанияраспознаватель жестов, даже если пользователь в конечном итоге использует только один или другой жест.Метод жеста делегата вызывается в момент прикосновения к экрану для любого жеста.Так что это не поможет.

Я добавил набор методов перехвата касаний к представлению страницы.Для touchesBegan:withEvent: я сбросил флаг.Для touches:moved:, который не вызывается для жеста касания, я установил флаг.Этот тип работает, но он слишком низкоуровневый и может не работать правильно для какого-то другого вида жеста в будущем, который также перемещается, но не является смахиванием / панорамированием.И жест касания UIPageViewController, кажется, поглощает событие касания полностью, поэтому даже touchesBegan:withEvent: не вызывается (что странно).

Есть ли способ отличить надежно после того, какна самом деле, какой стиль переворачивания страницы (касание или панорамирование / пролистывание) UIPageViewController использовал для обработки взаимодействия пользователя с перелистыванием страницы?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вопрос в том, как определить, какой из нескольких распознавателей жестов отвечает за что-то происходящее.

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

При настройке подкласса UIPageViewController после его загрузки или создания экземпляра добавьте следующий код (илиЭквивалент кода Swift):

for (UIGestureRecognizer *gr in self.gestureRecognizers) {
    if ([gr class] == [UIPanGestureRecognizer class])
        [gr addTarget:self action:@selector(panGestureOccurred)];
     else if ([gr class] == [UITapGestureRecognizer class])
        [gr addTarget:self action:@selector(tapGestureOccurred)];
    }

Затем добавьте два метода target / action к подклассу:

- (void)tapGestureOccurred
{
    // Set a flag here to rely on later after the page turn
}

- (void)panGestureOccurred
{
    // Reset a flag here to rely on later after the page turn
}

Это, очевидно, обобщает для любых других типов жестов, но в настоящее времяUIPageViewController.

panGestureOccurred будет вызываться только при помощи жестов панорамирования и касания, когда пользователь касается экрана и перемещает палец / стилус.tapGestureOccurred вызывается только один раз.

Но будет вызываться только один из двух методов, в зависимости от того, какой распознаватель жестов победит контроллер представления страницы в своей бесконечной мудрости.Кажется, что все это работает намного надежнее, чем идея слишком низкого уровня touchesBegan и touchesMoved, изложенная в первоначальном вопросе.

0 голосов
/ 25 февраля 2019

В gestureRecognizer:shouldReceiveTouch: вы можете проверить тип жеста.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if gestureRecognizer is UITapGestureRecognizer {
       self.wasTap = true;
       self.wasSwipe = false;
    } else if gestureRecognizer is UISwipeGestureRecognizer {
       self.wasTap = false;
       self.wasSwipe = true;
    }
    return true;
}

Затем в pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: измените состояние последней страницы, основываясь на булевом значении true.

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