如何判断UIPageViewController页面是否转动是由于滑动/平移或点击

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断UIPageViewController页面是否转动是由于滑动/平移或点击相关的知识,希望对你有一定的参考价值。

使用UIPageViewController时,用户可以向右或向左滑动以创建跟随其手指的动画翻页。或者用户只需点击页面视图的一侧或另一侧就可以翻页。页面转动动画完成后,调用委托方法pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:方法。

我希望我的最终页面状态略有不同,具体取决于用户是否通过滑动或点按来翻页。但我无法找出一种可靠的方法来确定导致翻页的原因。 pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:方法不提供该信息。

在我的UIPageViewController委托(self)中,调用了gestureRecognizer:shouldReceiveTouch:方法,但是即使用户最终只使用一个或另一个手势,也会调用滑动(平移)和轻击手势识别器。委托手势方法在触摸任一手势的屏幕时被称为。所以这没有用。

我在页面视图中添加了一组与触摸相关的拦截方法。对于touchesBegan:withEvent:,我重置了一个标志。对于没有调用轻击手势的touches:moved:,我设置了标志。这种作品,但它太低级,可能无法正常用于将来移动的其他类型的手势,但不是滑动/平移。并且UIPageViewController的轻敲手势似乎完全吞噬了触摸事件,因此甚至没有调用touchesBegan:withEvent:(这很奇怪)。

是否有任何方法可以有效地区分,事实上,UIPageViewController用于处理用户的交互以转换页面的页面转动(点击或平移/滑动)?

答案

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:中根据布尔值更改最终页面的状态。

另一答案

问题是如何确定几个手势识别器中的哪一个对发生的事情负责。

要理解的关键是任何手势识别器都可以安装多个目标/操作。 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)];
    }

然后,将两个目标/操作方法添加到子类:

- (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
}

这显然适用于任何其他类型的手势,但目前只有pan和tap手势似乎由UIPageViewController支持。

当用户触摸屏幕并移动手指/手写笔时,将多次调用panGestureOccurredtapGestureOccurred只被召唤一次。

但是只会调用两种方法中的一种,这取决于其无限智慧中的页面视图控制器决定获胜的手势识别器。这一切似乎比原始问题中提出的太低级别的touchesBegantouchesMoved想法更有效。

以上是关于如何判断UIPageViewController页面是否转动是由于滑动/平移或点击的主要内容,如果未能解决你的问题,请参考以下文章

在两页模式下如何实现可缩放的 UIPageViewController?

如何在 UIPageViewcontroller 中添加两个视图控制器

如何判断UIPageViewController页面是否转动是由于滑动/平移或点击

UIPageViewController 空白页

swift+UIPageViewController 纯代码实现引导页

UIPageViewController制作小说翻页效果