如何判断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
支持。
当用户触摸屏幕并移动手指/手写笔时,将多次调用panGestureOccurred
。 tapGestureOccurred
只被召唤一次。
但是只会调用两种方法中的一种,这取决于其无限智慧中的页面视图控制器决定获胜的手势识别器。这一切似乎比原始问题中提出的太低级别的touchesBegan
和touchesMoved
想法更有效。
以上是关于如何判断UIPageViewController页面是否转动是由于滑动/平移或点击的主要内容,如果未能解决你的问题,请参考以下文章
在两页模式下如何实现可缩放的 UIPageViewController?
如何在 UIPageViewcontroller 中添加两个视图控制器
如何判断UIPageViewController页面是否转动是由于滑动/平移或点击