在 UITableViewCell 的子视图上添加单击和双击手势

Posted

技术标签:

【中文标题】在 UITableViewCell 的子视图上添加单击和双击手势【英文标题】:Adding single and double tap gesture on subview of UITableViewCell 【发布时间】:2013-06-10 06:13:47 【问题描述】:

我在UITableViewCell 中有一个UIImageView。我正在尝试添加单击手势以全尺寸查看它,并添加双击手势来喜欢。这是我的代码:

    UITapGestureRecognizer *aSingleTapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(SingleTapGestureRecognizer:)] autorelease];
    aSingleTapGesture.delegate = self;
    aSingleTapGesture.numberOfTapsRequired = 1;
    [cell.imgProductImage addGestureRecognizer:aSingleTapGesture];

    UITapGestureRecognizer *aDoubleTapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognizer:)] autorelease];
    aDoubleTapGesture.delegate = self;
    aDoubleTapGesture.numberOfTapsRequired = 2;
    [cell.imgProductImage addGestureRecognizer:aDoubleTapGesture];

它只调用单击手势,从未调用过双击手势。比我在单击手势上使用require to fail

   [aSingleTapGesture requireGestureRecognizerToFail:aDoubleTapGesture];

好吧,使用此代码我可以同时调用单击和双击手势,但问题是 tableView:didSelectRowAtIndexPath: 也被调用了。如果我的手势被调用,我不想调用 didSelectRowAtIndexPath。据我了解,之所以调用它是因为单击手势正在等待双击手势,而 didSelectRowAtIndexPath 正在被调用。

请帮忙。

【问题讨论】:

你检查***.com/questions/14967125/… 谢谢.. 如果是这样,我需要检查我是否点击了 Image 或点击了 TableViewCell 的其他部分。我如何在didSelectRowAtIndexPath 中查看? 【参考方案1】:

您可以在 tableview 单元格中使用 UIButton 而不是 UIImageView。使用以下代码获取单击和双击。

//add target for your UITableViewCell's button

[aBtnThumbObj addTarget:self action:@selector(btnThumbClickDouble:) forControlEvents:UIControlEventTouchDownRepeat];

[aBtnThumbObj addTarget:self action:@selector(btnThumbClickSingle:) forControlEvents:UIControlEventTouchUpInside];

-(void)btnThumbClickSingle:(UIButton*)sender

    [self performSelector:@selector(singleTapOnButtonSelector:) withObject:sender afterDelay:0.2];

-(void)btnThumbClickDouble:(UIButton*)sender
   
   [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTapOnButtonSelector:) object:sender];
//Your implementation for double tap

-(void)singleTapOnButtonSelector:(UIButton*)sender

//Your implementation for single tap

【讨论】:

【参考方案2】:

您可以将单元格的选择样式设置为

cell.selectionStyle = UITableViewCellSelectionStyleNone;

然后就是不要实现你的 -tableViewDidSelectRowAtIndexPath 方法

【讨论】:

是的。但我需要实现-tableViewDidSelectRowAtIndexPath,因为如果用户选择图像以外的部分,它应该在另一个视图控制器上执行推送。【参考方案3】:

这两行代码对我有用:

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

【讨论】:

以上是关于在 UITableViewCell 的子视图上添加单击和双击手势的主要内容,如果未能解决你的问题,请参考以下文章

为啥我必须删除为 UITableViewCell 添加的子视图,而不是在 UITableViewCell 的子类中?

在自定义 UITableViewCell 的子视图中添加 UIViewController

将imageview添加为uitableviewcell的子视图时如何使imageview可拉伸

如何在 UITableViewCell 上保留子视图

Xcode 7 beta 5、Swift 2:UITableViewCell 的子视图在运行时未添加到 contentView

具有两个子视图的 UITableViewCell,第二个添加的子视图位置和大小未显示为已初始化