14

我试图忽略 UITapGestureRecognizer 在 UITableView 上的点击,如下所示:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      if ([touch.view isKindOfClass:[UITableViewCellContentView class]]) {
          return NO; // ignore the touch
      }
      return YES; // handle the touch
}

它不会编译:“使用未声明的标识符 'UITableViewCellContentView'

无证类?需要子类?更好的方法来实现这一点?

谢谢你的帮助。

4

5 回答 5

42

这似乎做到了:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if([touch.view isKindOfClass:[UITableViewCell class]]) {
         return NO;
    }
    // UITableViewCellContentView => UITableViewCell
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
         return NO;
    }
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
         return NO;
    }
    return YES; // handle the touch
}
于 2012-11-07T17:53:28.530 回答
11

你可以这样做。

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
            return NO;
        }else{
            return YES;
        }
    }
于 2014-07-09T08:24:43.510 回答
6

我刚刚遇到这个问题,以下解决方案适用于所有 iOS 版本,而不会有 Apple 更改 tableView 的视图层次结构的风险。基本上,保留对您的 UITableView 的引用:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
      if([touch.view isDescendantOfView:detailsTableView]) {
          return NO;
      }
      return YES;
   }

//isDescendantOfView:YES if the receiver is an immediate or distant subview of view or if view is the receiver itself; otherwise NO.
于 2014-03-25T10:45:15.910 回答
2

这是所选答案的快速解决方案。

我无法使用名为“MyTableView”的依赖项检查,因为我有一个自定义 BaseViewController,许多视图控制器都从该控制器派生。一些视图控制器有一个表格视图,一些有一个集合视图或两者都有,但在所有情况下,手势识别器都会窃取他们的触摸。

我不想把这个手势处理代码放在每个子类中,所以我让它在基类中工作的唯一方法是:

extension BaseViewController: UIGestureRecognizerDelegate {

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        var view = touch.view
        while view != nil {
            if view!.isKindOfClass(UICollectionView) || view!.isKindOfClass(UITableView) {
                return false
            } else {
                view = view!.superview
            }
        }
        return true
    }

}
于 2016-01-11T21:52:27.740 回答
0

我认为检查触摸区域更清晰、更简单。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                       shouldReceive touch: UITouch) -> Bool {

    let point = touch.location(in: viewContentContainer)
    return !tableRules.frame.contains(point)
}
于 2019-08-02T13:10:47.117 回答