【问题标题】:How to compare the types of gestures on iOS?如何比较 iOS 上的手势类型?
【发布时间】:2014-12-14 23:15:26
【问题描述】:

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

第一个是UITapGestureRecognizer,另外两个是UILongPressGestureRecognizer

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

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

该函数确实允许识别所有手势,但问题是每当识别出UILongPressGestureRecognizer 时,也会识别出UITapGestureRecognizer

所以,我想知道如何比较手势识别器中的类型

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer: (UIGestureRecognizer *) otherGestureRecognizer

或如何在检测到UILongPressGestureRecognizer 时停止UITapGestureRecognizer,因为每当触发UILongPressGestureRecognizer 时都会触发UITapGestureRecognizer

【问题讨论】:

    标签: ios objective-c ios8 uigesturerecognizer uitapgesturerecognizer


    【解决方案1】:

    不要将YES返回shouldRecognizeSimultaneouslyWithGestureRecognizer:中的所有情况,如果您不希望同时识别手势,您实际上应该返回NO

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

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

    - (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;
        }
    }
    

    【讨论】:

    • 我尝试使用您推荐的第二个代码块,但我不断收到“意外的接口名称”错误。我该如何解决这个问题?错误出现在 UITapGestureRecognizer 和 UILongPressGestureRecognizer。
    • @madtapper 我想我知道问题所在...我借用了 shim 的 "isMemberOfClass:" 行,但不是 100% 正确... 一秒钟...
    • 我稍微修改了一下,现在可以了。感谢您的帮助。
    • @madtapper 很高兴它有效。 :) 你还修改了什么?
    • 我试图在这里发布代码,但它只是一团糟。
    【解决方案2】:

    可以检查 UIGestureRecognizer 的类
    例如:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 好的,我尝试将这些代码行添加到我的项目中,只需复制并粘贴到 UIViewController 的类文件中,在 ViewDidLoad 区域之外,它就可以了!超级开心!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2011-08-27
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多