shouldReceiveTouch上UITableViewCellContentView(shou

2019-07-03 15:11发布

我试图忽视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’

无证类? 需要继承? 更好的方式来做到这一点?

谢谢你的帮助。

Answer 1:

这似乎做到这一点:

- (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
}


Answer 2:

你可以这样做。

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
            return NO;
        }else{
            return YES;
        }
    }


Answer 3:

我刚刚过这个问题来了,下面的解决方案适用于所有iOS版本,而不必苹果改变的tableView的视图层次的风险。 Basicaly,存到自己的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.


Answer 4:

下面是所选答案的迅速解决。

我不能使用“MyTableView”命名的相关性检查,因为我有一个自定义BaseViewController许多视图控制器从派生。 有些视图控制器有一个tableview中,一些有一个集合视图或两个,但在所有的情况下,手势识别窃取他们的风格。

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

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
    }

}


文章来源: shouldReceiveTouch on UITableViewCellContentView