如何比较iOS上的手势类型?

时间:2014-12-14 23:15:26

标签: ios objective-c ios8 uigesturerecognizer uitapgesturerecognizer

我在一个视图上有三种不同的手势,两种不同的类型。

首先是UITapGestureRecognizer,其他两个是UILongPressGestureRecognizer

长按手势识别器有不同的minimumPressDuration,一个是0.15,另一个是0.50,所以我实现了以下功能,以便识别所有手势:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *) otherGestureRecognizer{
    return true;
}

该功能确实允许识别所有手势,但问题是只要识别出UILongPressGestureRecognizer,也会识别UITapGestureRecognizer

所以,我想知道如何比较

中的gestureRecognizer类型
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *) otherGestureRecognizer

或如何在检测到UITapGestureRecognizer时停止UILongPressGestureRecognizer,因为只要触发UITapGestureRecognizer就会触发UILongPressGestureRecognizer

3 个答案:

答案 0 :(得分:3)

如果您不希望同时识别手势,而不是将YES返回shouldRecognizeSimultaneouslyWithGestureRecognizer:中的所有案例,则应该实际返回NO

- (BOOL) gestureRecognizer: (UIGestureRecognize *) gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *) otherGestureRecognizer {
   return NO;
}

但要完成您显然要完成的任务,我建议您使用其他UIGestureRecognizerDelegate方法 - gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer: - 这样您就可以指定哪个手势在另一个之前被识别。在这种情况下,由于您希望在检测到UITapGestureRecognizer时停止UILongPressGestureRecognizer,请尝试以下操作:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

    // If the gesture recognizer is a UITapGestureRecongizer, but the other
    // gesture detected is a UILongPressGestureRecognizer, require the
    // UITapGestureRecognizer to fail.
    if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] &&
        [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) {
       return YES;
    } else {
       return NO;
    }
}

答案 1 :(得分:1)

可以检查UIGestureRecognizer的类 例如:

-(BOOL) gestureRecognizer: (UIGestureRecognize *) gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *) otherGestureRecognizer {
    if ([gestureRecognizer isMemberOfClass: [UILongPressGestureRecognizer class]]) {
       //do stuff
    }
//etc
}

答案 2 :(得分:0)

我将Swift 5的代码转换为这篇文章。 当我从Apple Documents中取出它时,它应该可以工作。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
   shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer)
    -> Bool { 
    return true
 }

我将在明天尝试此操作,因为我一直在努力与UIScrollView和UISwipeGestureRecognizer一起工作。如果禁用滚动,则手势起作用,但是如果启用滚动(所需),则手势不起作用。我希望此功能用于在上下滚动滚动视图时隐藏和显示顶部的导航栏和底部的TabBar。 然后,我将尝试使其与我的应用程序下一页上的UICollectionView一起使用。 对于编码是新手,如果上述代码不够用,任何建议都将不胜感激。 如果有效,我将更新此评论。