【问题标题】:UITapGestureRecognizer swallows all gesturesUITapGestureRecognizer 吞下所有手势
【发布时间】:2012-06-07 07:34:36
【问题描述】:

我正在尝试将 UITapGestureRecognizer 添加到我的应用程序中,这样我就可以检测到所有两个手指点击并采取行动,但传递任何其他用户输入。听起来微不足道,但我就是无法让它工作。到目前为止,这是我的代码,在我的主视图控制器中:

- (void) viewDidLoad {
  // other init stuff
  UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
  [tapRecognizer setNumberOfTouchesRequired:2];
  [tapRecognizer setNumberOfTapsRequired:1];
  [tapRecognizer setCancelsTouchesInView:NO];

  UIView *tapHolderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
  [tapHolderView setMultipleTouchEnabled:YES];
  [tapHolderView addGestureRecognizer:tapRecognizer];

  [self.view addSubview:tapHolderView];

  [tapRecognizer release];
}

- (void) handleTap:(UITapGestureRecognizer *) sender {
  if (sender.state == UIGestureRecognizerStateEnded) {
    // do something
  }
}

发生的情况是:两指点击会触发 handleTap 方法。任何其他用户输入,无论是滑动、捏合、单指点击等,都不会被任何其他视图(UIToolbar、UIWebView 等)拾取。

我非常感谢任何对此的见解,如果我对这个问题不够具体,请告诉我。

【问题讨论】:

    标签: ios uiview uiviewcontroller multi-touch uitapgesturerecognizer


    【解决方案1】:

    尝试将视图控制器设置为 UIGestureRecognizerDelegate 的委托,并实现gestureRecognizer:shouldRecognizeSimulaneouslyWithGestureRecgonizer 始终返回“YES”。示例:

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

    【讨论】:

    • 感谢您的帮助。我按照你的建议,还是一样的结果。我还在 shouldRecognizeSimultaneouslyWithGestureRecognizer 方法中添加了一条日志语句,它似乎永远不会被调用。也许这是解决我的问题的线索?
    • 啊!我不需要 shouldRecognizeSimultaneouslyWithGestureRecognizer 但是,我将 UITapGestureRecognizer 添加到我的视图中,而不是添加到我作为子视图添加的新视图中,然后触摸按预期传递!谢谢!
    【解决方案2】:

    我唯一能想到的就是使用:

     [tapRecognizer setDelegate:self];
    

    您是否在视图控制器中为手势识别器定义了任何委托方法?您会尝试评论该行以进行快速测试吗?

    【讨论】:

    • 感谢您的帮助!如果我注释掉该行,则不会调用 handleTap 方法,并且在任何视图中都不会检测到任何手势。
    • 有趣...设置委托不是手势识别器工作所必需的。您是否定义了任何委托方法?是否有任何其他手势识别器可能会影响第一个?
    • 哦,对不起,我的错。当我注释掉 [tapRecognizer setDelegate:self] 时,我得到相同的结果:handleTap 在两指点击时被调用,但没有其他手势被传递给其他视图。通过删除此行更新了问题。谢谢!
    【解决方案3】:

    我们在同一个视图中实现了单击和双击手势。希望这会有所帮助

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] 
                                         initWithTarget:self 
                                         action:@selector(handleSingleTapOnMainImageView:)];
    
    [self addGestureRecognizer:singleTap];
    [singleTap release];
    
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] 
                                         initWithTarget:self 
                                         action:@selector(handleDoubleTapOnMainImageView:)];
    [doubleTap setNumberOfTapsRequired:2];
    [singleTap requireGestureRecognizerToFail:doubleTap];
    [self addGestureRecognizer:doubleTap];
    [doubleTap release];
    

    【讨论】:

    • 这是工作代码吗?你是在singleTap发布后访问的,对吧?
    • 这是工作代码。 alloc 需要释放。是的,我在singleTap 发布后访问它。但在发布之前,我已经在我的视图上添加了手势。祝你有美好的一天......
    • 之所以有效,是因为self 保留了singleTap,所以它没有被释放。这仍然是非常糟糕的风格,在非 ARC 世界中,两个手势识别器都应该在这段代码的末尾发布。
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多