【问题标题】:Adding Multiple UITapGestureRecognizers to single view (Cocos2d)将多个 UITapGestureRecognizers 添加到单个视图(Cocos2d)
【发布时间】:2012-07-07 21:53:32
【问题描述】:

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

doubleTapRecognizer_ = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    doubleTapRecognizer_.numberOfTapsRequired = 2;
    doubleTapRecognizer_.cancelsTouchesInView = NO;
    [[[CCDirector sharedDirector] view] addGestureRecognizer:doubleTapRecognizer_];

我有这个类的多个实例,但唯一一个调用它的选择器是添加的最后一个实例。 UIView Class Reference 让我相信可以将多个 UIGestureRecognizer 添加到单个视图中。属性“gestureRecognizers”返回一个 NSArray。

事实上,我已经有一个 UIPanGestureRecognizer 使用来自另一个类的相同视图。所以我至少要让两个 UIGestureRecognizers 同时工作。

【问题讨论】:

    标签: uiview cocos2d-iphone uitapgesturerecognizer


    【解决方案1】:

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

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

    通过上述方式,您可以将多个手势识别器添加到同一个视图中,无论手势识别器是否属于同一类型。

    例如,您可以将两个UITapGestureRecognizer 添加到同一个视图中,两个点击手势识别器的回调将被调用。并且会先调用最后添加的回调。

    希望这会有所帮助。

    【讨论】:

    • 有时我们确实需要添加第二个与现有手势识别器相同类型的手势识别器。例如,对于MKMapView,上面已经有一个捏合手势,当我通过捏合手势缩放地图时,我想做一些其他的事情。在这种情况下,我需要在MKMapView 上添加另一个捏合手势识别器,同时使现有的捏合手势识别器工作。
    • 谢谢!我同意@HongchaoZhang 的用例确实存在,其中简单地从另一个方法运行函数调用并不能削减它。
    【解决方案2】:

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

    为什么?

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

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

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

    【讨论】:

    • 您的解决方案听起来很棒并且很容易实现,但是为了了解 doubleTapRecognizer_.cancelsTouchesInView = NO;那不是应该关闭触摸取消吗?
    猜你喜欢
    • 2012-02-06
    • 2013-12-07
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多