我试图忽略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'
无证课程?需要子类?更好的方法来实现这一目标?
感谢您的帮助。
答案 0 :(得分:39)
这似乎是这样做的:
- (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
}
答案 1 :(得分:10)
你可以这样做。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}else{
return YES;
}
}
答案 2 :(得分:5)
我刚遇到此问题,以下解决方案适用于所有iOS版本,而不存在Apple更改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.
答案 3 :(得分:2)
这是所选答案的快速解决方案。
我无法使用" 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
}
}
答案 4 :(得分:0)
我认为检查触摸区域清晰明了。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldReceive touch: UITouch) -> Bool {
let point = touch.location(in: viewContentContainer)
return !tableRules.frame.contains(point)
}