手势识别器和 TableView

Posted

技术标签:

【中文标题】手势识别器和 TableView【英文标题】:Gesture Recognizers and TableView 【发布时间】:2010-12-15 21:10:58 【问题描述】:

我有一个涵盖所有 UITableView 的 UIView。 UIView 使用手势识别器来控制表格显示的内容。 我仍然需要垂直 UITableView 滚动和行点击。 如何将这些从手势识别器传递到表格?

【问题讨论】:

我认为“[tablView 手势]”应该是“[yourTableView addGestureRecognizer:gesture]” 【参考方案1】:

如果您需要知道单元格的 indexPath:

- (void)handleSwipeFrom:(UIGestureRecognizer *)recognizer 
    CGPoint swipeLocation = [recognizer locationInView:self.tableView];
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation];
    UITableViewCell *swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath];

这是之前在UIGestureRecognizer and UITableViewCell issue 中回答的。

【讨论】:

谢谢,我正在寻找这个解决方案。我不知道locationInView 非常感谢【参考方案2】:

将您的手势分配给表格视图,表格将处理它:

UISwipeGestureRecognizer *gesture = [[UISwipeGestureRecognizer alloc]
        initWithTarget:self action:@selector(handleSwipeFrom:)];
[gesture setDirection:
        (UISwipeGestureRecognizerDirectionLeft
        |UISwipeGestureRecognizerDirectionRight)];
[tableView addGestureRecognizer:gesture];
[gesture release];

然后在你的手势动作方法中,根据方向动作:

- (void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer 
    if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) 
        [self moveLeftColumnButtonPressed:nil];
    
    else if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) 
        [self moveRightColumnButtonPressed:nil];
    

表格只会在内部处理后将您要求的手势传递给您。

【讨论】:

这是一个很好的答案。但是你能告诉我如何知道handleSwipeFrom方法中的tableview indexPath吗? 这不起作用 - UISwipeGestureRecognizer 上的方向属性指示可以识别哪些方向(在本例中为左和右)而不是滑动的方向。您需要将手势识别器分开 是的,recognizer.direction 将始终为 3 并且永远不会匹配。这可以说是一个错误:***.com/questions/3319209/…【参考方案3】:

我尝试了 Rob Bonner 的建议,效果很好。谢谢。

但是,就我而言,方向识别存在问题。 (recognizer.direction 总是参考 3)我使用的是 ios5 SDK 和 Xcode 4。

我认为这似乎是由“[gesture setDirection:(left | right)]”引起的。 (因为预定义的(dir left | dir right)计算结果是3)

所以,如果有人像我一样有问题并且想分别识别左右滑动,那么将两个识别器分配给不同方向的表格视图。

像这样:

UISwipeGestureRecognizer *swipeLeftGesture = [[UISwipeGestureRecognizer alloc] 
                                             initWithTarget:self
                                             action:@selector(handleSwipeLeft:)];
[swipeLeftGesture setDirection: UISwipeGestureRecognizerDirectionLeft];

UISwipeGestureRecognizer *swipeRightGesture = [[UISwipeGestureRecognizer alloc] 
                                              initWithTarget:self 
                                              action:@selector(handleSwipeRight:)];

[swipeRightGesture setDirection: UISwipeGestureRecognizerDirectionRight];

[tableView addGestureRecognizer:swipeLeftGesture];
[tableView addGestureRecognizer:swipeRightGesture];

下面还有手势动作:

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)recognizer 
    [self moveLeftColumnButtonPressed:nil];


- (void)handleSwipeRight:(UISwipeGestureRecognizer *)recognizer 
    [self moveRightColumnButtonPressed:nil];

我使用 ARC 功能进行编码,如果您不使用 ARC,请添加发布代码。

PS:我的英文不太好,如有错误,望指正:)

【讨论】:

以上是关于手势识别器和 TableView的主要内容,如果未能解决你的问题,请参考以下文章

影响滑动删除行的 TableView 手势识别器

使平移手势识别器仅在向下滑动时在桌面视图的顶部进行响应

我可以在 tableviewcell 中发现 tableview 手势识别器的状态吗

手势识别器滑动以从核心数据中删除

iOS中添加UITapGestureRecognizer手势识别后,UITableView的didSelectRowAtIndexPath失效

iOS - 在视图(Swift)中为多个Tableview或Collectionviews使用/传递手势识别器