UITableview的didSelectRowAtIndexPath方法会覆盖双击手势的UITapGestureRecognizer。

7
我已经使用双击UITapGestureRecognizer设置了一个UITableView。但是用户尝试双击单元格时,只会启动didSelectRowAtIndexPath两次。这两者是否应该一起工作?
(我知道我可以使用单击手势识别器代替didSelectRowAtIndexPath的内置行为,但是问题在于:当我添加单击手势识别器时,单元格还有一个按钮无法按下。此外,我在SO上看到过用户将双击功能构建到didSelectRowAtIndexPath中的示例,但那不是有点太麻烦了吗?)

我想要一个类似的功能。即使设置了 cancelsTouchesInViewdelaysTouchesBegan,我仍然无法调用双击处理程序。 - Anupdas
4个回答

12

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

  • cancelsTouchesInView
  • delaysTouchesBegan
  • delaysTouchesEnded

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

在我的情况下,我向自定义UITableViewCell中的一个UIImageView添加了两个轻拍手势时出现问题。当您在UIImageView上单击/双击时,将调用didSelectRowAtIndexPath:。当我只有一个轻拍手势时,didSelectRowAtIndexPath:不会被调用(对我来说,这是正确的行为)。

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

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

更改后,在自定义单元格上方的UIImageView上轻敲/双击不会触发didSelectRowAtIndexPath:


5

看起来我可以使用手势识别器的delaysTouchesBegan和cancelsTouchesInView属性,让didSelectRowAtIndexPath和双击手势识别器很好地结合起来。

@MSgambel描述的另一种选择似乎同样有效。


2

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


您说的是设置委托,然后实现gestureRecognizer:shouldReceiveTouch:或gestureRecognizerShouldBegin。谢谢提醒。我会尝试让它工作,然后将其接受为答案。同时,您似乎在说您同意我在原始问题中所描述的情况行不通? - kris
жҳҜзҡ„пјҢеӣ дёәж–№жі•didSelectRowAtIndexPathе…·жңүдјҳе…Ҳзә§й«ҳдәҺжүӢеҠҝиҜҶеҲ«еҷЁзҡ„и§Ұж‘ёдәӢ件жӢҰжҲӘеҠҹиғҪпјҢиҖҢдё”з”ұдәҺжӮЁеҫҲеҸҜиғҪе·Із»Ҹе®һзҺ°дәҶе®ғпјҢжүӢеҠҝиҜҶеҲ«еҷЁе°Ҷж°ёиҝңдёҚдјҡиў«и°ғз”ЁгҖӮ - msgambel
实际上,我还没有彻底测试过它,但是我发现将手势识别器的属性delaysTouchesBegan和cancelsTouchesInView设置为YES可以给我想要的行为。 - kris

1

我使用"delayTouchesBegan"方法测试了双击,但发现单击由表格接收后会被延迟,在用户与表格的交互中响应变差,甚至有些烦人。

我的解决方案有些平凡,但我在didSelectRowAtIndexPath方法中使用定时器来检测点击。我记录第一次点击的点击计数为“1”,如果用户在0.2秒内没有再次点击,则显示所选项目。如果用户在0.2秒内进行第二次点击,则显示另一个项目(动作表)。每次都重置点击计数。

这种方法使用了更多的代码,但可以快速响应界面上的操作,而且用户无需知道幕后发生了什么——只需要知道UI是响应的即可。


感谢您的输入。我对创建计时器来处理此事持怀疑态度,但这是一个创意的想法。谢谢! - kris
使用内置的识别器时,延迟时间太长了,所以我倾向于认同用户更喜欢这种响应性能提供的方式,尽管在幕后有点不正规。 - DuneCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接