UITableview didSelectRowAtIndexPath取代UITapGestureRecognizer的双击手势

时间:2011-09-15 00:27:47

标签: iphone ios uitableview uigesturerecognizer

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

(我知道我可以使用单击手势识别器代替didSelectRowAtIndexPath的内置行为,但是问题就在于:单元格还有一个按钮,当我添加时我不能按下单击手势识别器。此外,我已经看到用户在didSelectRowAtIndexPath中建立双击功能的例子,但是这不是一个太多的黑客攻击吗?)

4 个答案:

答案 0 :(得分:11)

有关Kris回答的更多信息:

  • cancelsTouchesInView
  • delaysTouchesBegan
  • delaysTouchesEnded

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

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

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

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

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

答案 1 :(得分:5)

看起来我可以使用手势识别器的delaysTouchesBegan和cancelsTouchesInView属性来获得didSelectRowAtIndexPath和双击手势识别器,以便很好地一起玩。

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我用双击测试了“delayTouchesBegan”方法,但我发现表格收到的单击然后被延迟,使得表格交互对用户的响应性降低,并且可能很烦人。

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

此方法使用更多代码,但从界面提供快速响应,用户无需知道幕后发生了什么 - 只是UI响应。