Uiview 向单个视图(Cocos2d)添加多个UITapgestureRecognitors

Uiview 向单个视图(Cocos2d)添加多个UITapgestureRecognitors,uiview,cocos2d-iphone,uitapgesturerecognizer,Uiview,Cocos2d Iphone,Uitapgesturerecognizer,我在onEnter方法中添加以下代码 doubleTapRecognizer_ = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; doubleTapRecognizer_.numberOfTapsRequired = 2; doubleTapRecognizer_.cancelsTouchesInView = NO; [[[CCDirecto

我在onEnter方法中添加以下代码

doubleTapRecognizer_ = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    doubleTapRecognizer_.numberOfTapsRequired = 2;
    doubleTapRecognizer_.cancelsTouchesInView = NO;
    [[[CCDirector sharedDirector] view] addGestureRecognizer:doubleTapRecognizer_];
我有这个类的多个实例,但唯一调用它的选择器的是添加的最后一个实例。这让我相信,在一个视图中添加多个UIgestureRecognitor是可能的。属性“手势识别器”返回NSArray


事实上,我已经有了一个UIPangestureRecognitor,它处理来自另一个类的相同视图。因此,我将同时使用至少两个手势识别器。

您可以在同一视图中添加多个手势识别器。您不能(轻松地)将相同手势识别器类型(平移、滑动、双击等)的多个实例添加到同一视图中

为什么?

因为一旦第一个手势识别器识别出该手势(在这种情况下双击),它就会取消所有触摸事件。因此,其余的手势识别器永远不会完成识别,也永远不会触发其事件

您不需要多个相同类型的手势识别器。在您的情况下,一旦收到双击事件,您就可以向正确的对象发出双击信号。使用识别器的位置和其他属性来查找,例如,双击的精灵,然后让它执行任何需要执行的操作


因此,让场景层次结构中的更高级别节点(即UI层)识别手势是一种很好的设计,然后该节点将事件传递到相应的节点,或者干脆忽略它。

为了在同一视图中添加多个
UIGestureRecognitor
,您需要设置添加到视图中的手势识别器的
委托
属性,并在委托中实现以下方法:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}
通过上述方式,您可以在同一视图中添加多个手势识别器,无论手势识别器是否为同一类型

例如,可以在同一视图中添加两个
uitappesturerecognizer
,并调用两个轻触手势识别器的回调。最后添加的回调将首先调用


希望这能有所帮助。

您的解决方案听起来不错,而且很容易实现,但为了了解doubleTapRecognizer的意义何在?cancelsTouchesInView=NO;这不是应该关闭触摸取消吗?有时我们真的需要添加第二个与现有手势识别器相同类型的手势识别器。例如,对于一个
MKMapView
,上面已经有一个收缩手势,我想在通过收缩手势缩放地图时做一些其他事情。在这种情况下,我需要在
MKMapView
上添加另一个按压手势识别器,同时使现有的按压手势识别器工作。谢谢!我同意w@HongchaoZhang的说法,用例确实存在,仅仅从另一个方法运行函数调用并不能解决这个问题。