iOS在刷卡时禁用平移

iOS在刷卡时禁用平移,ios,swipe,uipangesturerecognizer,uiswipegesturerecognizer,pan,Ios,Swipe,Uipangesturerecognizer,Uiswipegesturerecognizer,Pan,我想在滑动时禁用平移手势,如果平移则禁用平移,但无论是平移还是滑动,我最终都激活了这两种手势。我有什么不对劲吗 #pragma mark - UIGestureRecognizerDelegate methods - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)ot

我想在滑动时禁用平移手势,如果平移则禁用平移,但无论是平移还是滑动,我最终都激活了这两种手势。我有什么不对劲吗

#pragma mark - UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
    [otherGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];

    NSLog(@"added failure requirement to: %@", otherGestureRecognizer);
}

if ([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]]) {
    [[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer requireGestureRecognizerToFail:gestureRecognizer];
}

if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
    [left requireGestureRecognizerToFail:[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer];
    [right requireGestureRecognizerToFail:[BTHomeViewController sharedInstance].revealViewController.panGestureRecognizer];
}

  return YES;
}

很难将这两种手势结合起来。问题是,您通常希望平移手势立即执行(确实如此),但由于用户必须将手指拖到某个路径,因此要识别滑动手势需要一些时间

无论如何,您通常可以考虑两种程序:

首先是使两个手势同时可识别(你已经做到了)。您需要添加的是,当识别到滑动手势时,只需删除平移手势调用。要做到这一点,您只需
panGesture.enabled=NO;panGesture.enabled=是这两行只是一行接一行地调用,直到另一次触摸开始,手势才会触发

第二个问题是等待是否能识别出刷卡。要做到这一点,最简单的方法是将平移手势替换为长按手势。请注意,长按手势与平移手势完全相同,但您可以将其设置为适当的
minimumPressDuration
(您希望在中识别滑动的持续时间)和适当的
allowableMovement
,这在您的情况下应该非常大。

我也有同样的问题

我和UIgestureRecognitzer代表玩了很多,但运气不好

我所做的是根据速度和完成姿势决定何时“平移”应被视为“滑动”。因此,如果用户开始平移且速度小于某个值,则继续;如果用户快速平移并完成手势,则触发“滑动”


这符合我的业务需求。希望有帮助。

用手势建立关系,使之成为可能:

panGesture.require(toFail: swipeGesture)

嗨,谢谢你的提示。我的目标是做像《纽约时报》这样的应用程序。我使用的是SWRevealViewController,所以更改为长按可能对我有点挑战。这是怎么回事?正如我所说的,如果您设置了一些非常低的minimumPressDuration,则用长按替换平移手势将与平移手势的动作相同。此操作不应更改任何其他代码。无论如何,再看看你的问题,似乎有点矛盾:平移时禁用滑动是不可能的,因为平移手势将作为滑动手势的一部分触发。如果可能的话,您可能需要考虑使用触摸方法实现自定义手势控件。但这并不是一件容易的事情。如果我使用长按,我将无法检测用户滑动的方向。在什么情况下,我应该对panGesture设置是/否?啊,不,你误解了。您保留了滑动手势,但将平移手势替换为长按。在这种情况下,长按将等待一段时间,以查看是否检测到刷卡,如果未检测到,则触发,然后取消刷卡手势。因此,在这种情况下,您应该删除委托方法。“是/否”用于您已经遇到的情况:一旦检测到滑动手势,您就在平移手势识别器上调用该手势,以便它停止识别,直到触发下一个手势。我发布的是两个不同的程序,你可以选择一个,但不能同时选择两个。嗨,shoujo_sm,这个答案帮助我了解了如何解决这个问题。即使最后很艰难,我还是在我的案例中使用了UIScrollView属性delaysContentTouches。下面是文档中关于此属性的说明:“如果此属性的值为“是”,则滚动视图会延迟处理触摸手势,直到它能够确定滚动是否是目的。如果该值为“否”,则滚动视图会立即调用ToucheShouldBegin:withEvent:inContentView:。默认值为“是”