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

Posted

技术标签:

【中文标题】如何比较 iOS 上的手势类型?【英文标题】:How to compare the types of gestures on 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

【问题讨论】:

【参考方案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 区域之外,它就可以了!超级开心!

以上是关于如何比较 iOS 上的手势类型?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 上的全系统手势识别

如何在 iOS 设备上的滑动手势期间“捕捉”子视图?

如何在 iOS 7 上的 UINavigationController 中禁用向后滑动手势

IOS 手势-轻点触摸手势

UITableView滑动删除iOS上的手势冲突

ios 滑动手势在子视图上未被识别,父视图上的手势