【问题标题】:UITableview didSelectRowAtIndexPath supercedes double tap gesture by UITapGestureRecognizerUITableview didSelectRowAtIndexPath 取代了 UITapGestureRecognizer 的双击手势
【发布时间】:2011-11-17 11:35:51
【问题描述】:

我已经设置了一个带有双击 UITapGestureRecognizer 的 UITableView。但是用户双击单元格的尝试只是启动了 didSelectRowAtIndexPath 两次。这两个应该一起工作吗?

(我知道我可以使用单击手势识别器代替 didSelectRowAtIndexPath 的内置行为,但问题在于:单元格还有一个按钮,当我添加时我无法再按下单击手势识别器。此外,我还看到了一些用户在 didSelectRowAtIndexPath 中构建双击功能的示例,但这不是有点过分吗?)

【问题讨论】:

  • 我想要一个类似的功能。即使设置了cancelsTouchesInViewdelaysTouchesBegan,我也无法调用双击处理程序。

标签: iphone ios uitableview uigesturerecognizer


【解决方案1】:

可以使用单次点击手势识别器代替didSelectRowAtIndexPath,即使单元格中有一个按钮。您只需要检查触摸位置是否在UIButton 的视图内即可处理这两种情况。希望有帮助!

【讨论】:

  • 正确-您谈论的是设置委托,然后实现gestureRecognizer:shouldReceiveTouch:或gestureRecognizerShouldBegin。感谢您的提醒。我会尝试让这个工作,然后接受作为答案。另外,听起来您说您同意我在上面原始问题中的方案行不通?
  • 是的,didSelectRowAtIndexPath 方法会拦截触摸事件,因为它优先于手势识别器,并且由于您很可能已经实现了它,因此永远不会调用手势识别器。
  • 实际上,我还没有彻底测试它,但我看到手势识别器的属性 delaysTouchesBegan 和 cancelsTouchesInView 设置为 YES 给了我想要的行为。
【解决方案2】:

看起来我可以使用手势识别器的 delaysTouchesBegan 和 cancelsTouchesInView 属性让 didSelectRowAtIndexPath 和双击手势识别器很好地协同工作。

@MSgambel 描述的另一个选项似乎同样有效。

【讨论】:

    【解决方案3】:

    关于 Kris 的回答的更多信息:

    • 取消TouchesInView
    • delaysTouchesBegan
    • delaysTouchesEnded

    http://developer.apple.com/library/ios/#documentation/uikit/reference/UIGestureRecognizer_Class/Reference/Reference.html

    在我的情况下,我在向自定义 UITableViewCell 上的 UIImageView 添加 2 个轻击手势时遇到了问题。当您点击/双击UIImageView 时,会调用didSelectRowAtIndexPath:。当我只有一个点击手势时,didSelectRowAtIndexPath: 没有被调用(对我来说,这是正确的行为。

    为了防止在使用两个轻击手势(单击/双击)时调用 didSelectRowAtIndexPath:,我将此代码添加到第一个轻击手势(单击):

    tapGesture.cancelsTouchesInView = YES;
    tapGesture.delaysTouchesBegan = YES;
    

    在此更改之后,UIImageView(在自定义单元格顶部)上的点击/双击不会触发 didSelectRowAtIndexPath:

    【讨论】:

      【解决方案4】:

      我用双击测试了“delayTouchesBegan”方法,但我发现表格接收到的单击会延迟,从而使表格交互对用户的响应速度变慢,并且可能很烦人。

      我的解决方案有点笨拙,但我使用计时器来检测方法 didSelectRowAtIndexPath 中的点击。我为第一次点击记录了“1”的点击计数,如果用户在 0.2 秒内没有再次点击,则会显示所选项目。如果用户在 0.2 秒内点击计数“2”,那么我会显示另一个项目(操作表)。我每次都会重置点击次数。

      此方法使用更多代码,但提供了来自界面的快速响应,用户不需要知道幕后发生的事情 - 只是 UI 是响应式的。

      【讨论】:

      • 感谢您的意见。我对创建一个计时器来处理这个问题的想法持怀疑态度,但这仍然是一个创造性的想法。谢谢!
      • 使用内置识别器时延迟太长了,所以我倾向于同意用户会喜欢它提供的更多响应,即使它在幕后有点hacky。
      猜你喜欢
      • 2012-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多