如何比较 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 上的手势类型?的主要内容,如果未能解决你的问题,请参考以下文章