Вопрос в том, как определить, какой из нескольких распознавателей жестов отвечает за что-то происходящее.
Главное, что нужно понять, это то, что в любом распознавателе жестов может быть установлено несколько целей / действий.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
, изложенная в первоначальном вопросе.