滑动和平移手势重叠
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 实现,对于菜鸟来说有点复杂)实际上是在视图控制器上使用的不同库上。谢谢。以上是关于滑动和平移手势重叠的主要内容,如果未能解决你的问题,请参考以下文章