滑动和平移手势重叠

Posted

技术标签:

【中文标题】滑动和平移手势重叠【英文标题】:swipe and pan gesture overlap 【发布时间】:2013-08-28 14:47:37 【问题描述】:

是否可以让特定手势失败,以便识别下一个可能的手势?

更具体地说,查看示例 sn-p:

UISwipeGestureRecognizer *swipeLeft = [initialize UISwipeGestureRecognizer... @selector(handleSwipe:)]

swipeLeft = UISwipeGestureRecognizerDirectionLeft;

swipeLeft.delegate = self;

UIPanGestureRecognizer *pan = [initialize UIPanGestureRecognizer... @selector(handlePan:)]

pan.delegate = self;

[pan requireGestureRecognizerToFail:swipeLeft];

上面的代码表明,如果设备无法识别向左滑动,则将使用平移手势处理程序。

所以我的问题是:是否有可能让 swipeLeft 根据在 handleSwipe 上检查的某些标准故意失败(在被设备识别为向左滑动触摸之后),而让平移手势处理触摸输入?

谢谢。

【问题讨论】:

【参考方案1】:

在此处查看UIGestureRecognizerDelegate 协议:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIGestureRecognizerDelegate_Protocol/Reference/Reference.html

具体来说

gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

方法可能有用。如果你只是从这个方法中返回YES,两个手势可以同时被识别,所以你可以正确响应。

【讨论】:

识别同时的手势并没有给我想要的行为。向左滑动应该将 UIView 从一个位置移动到另一个位置,并且平移手势也会移动它,但基于您的触摸平移和速度。谢谢。 听起来平移识别器可以让您通过触摸移动视图,但是如果检测到滑动,您可以设置一个标志告诉平移停止工作,因为滑动行为将采取超过。你认为这可能会完成你想做的事情吗? 这是一个好主意,这就是我想要实现的目标,是否有一个更简单的实现,无需编写或覆盖您自己的 touchesBegan、Moved、Ended 方法来标记并让当前手势停止并传递给下一个手势行为?谢谢。 是的,我的建议是保留你的手势方法,从我提到的那个委托方法返回YES,然后有一个内部类属性(BOOL 应该足够了,我想想)喜欢didSwipe。在滑动识别器方法的开头,将其设置为YES - 这只会在识别滑动时发生。在您的 pan 方法中,将整个内容包装在 if 语句中:if (!self.didSwipe) ...,因此只有在没有滑动或尚未滑动时才会执行此部分。您可能还需要在某些时候重置该变量。 感谢您的建议,我认为该解决方案会奏效。将实现它,看看我是否可以获得所需的行为。【参考方案2】:

假设您为平移手势实现了一些其他处理程序,您不能这样做:

-(void)handleSwipe:(id)sender 

    if //criteria is met to ignore left swipe
    
        [self handlePan:self];   
    


-(void)handlePan:(id)sender 

    // handle pan gesture here


【讨论】:

这可以工作,但 handlePan(有自己的 touchesBegan、Moved、Ended 实现,对于菜鸟来说有点复杂)实际上是在视图控制器上使用的不同库上。谢谢。

以上是关于滑动和平移手势重叠的主要内容,如果未能解决你的问题,请参考以下文章

平移手势和滑动手势

手势方法(平移手势和滑动手势)之间是不是有任何优先条件?

同一视图中平移和滑动手势之间的冲突?

如何在半视图上实现滑动手势和在另一半视图上实现平移手势?

UIView/Drawer 使用平移/滑动手势

是否可以禁用滑动手势并仅使平移手势在滚动视图中工作?