如何判断uipageViewController页面是由于滑动/锅还是龙头



使用uipageViewController时,用户可以向右滑动或向左滑动以创建一个动画页面,以遵循其手指。或用户可以简单地点击页面视图的一侧或另一侧即可引起页面转。页面转动动画完成后,委托方法pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:方法被调用。

我希望我的最后一页状态略有不同,具体取决于用户是用滑动还是轻按页面。但是我无法找到一种强大的方法来确定是什么原因导致页面转。pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:方法不提供该信息。

在我的uipageViewController委托(self)中,调用了gestureRecognizer:shouldReceiveTouch:方法,但即使用户最终仅采用一个或另一个手势,也称其为滑动(PAN)和TAP手势识别器。当触摸屏幕以进行任何一个手势时,委托手势方法称为。所以这没有帮助。

我在页面视图中添加了一组与触摸相关的拦截方法。对于touchesBegan:withEvent:,我重置一个标志。对于不被要求进行抽气手势的touches:moved:,我设置了标志。这种作品,但是它太低了,对于将来的某些其他手势也无法正常工作,但也不是在移动,但不是滑动/锅。而且UipageViewController的Tap手势似乎完全吞噬了触摸事件,因此即使是touchesBegan:withEvent:也没有称呼(这很奇怪)。

有什么方法可以鲁棒性在事实之后,uipageViewController用来处理用户的交互来转动页面?p>

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支持。

panGestureOccurred在用户触摸屏幕并移动手指/手写笔时将被多次调用。tapGestureOccurred仅调用一次。

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

相关内容

  • 没有找到相关文章

最新更新