使用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
仅调用一次。
,但只有两种方法中的一种将被调用,具体取决于手势识别器在其无限智慧中决定获胜的页面视图控制器。这一切似乎比原始问题中提出的太低级别touchesBegan
和touchesMoved
的想法更强大。