我试图忽视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’
无证类? 需要继承? 更好的方式来做到这一点?
谢谢你的帮助。
这似乎做到这一点:
- (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
}
你可以这样做。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}else{
return YES;
}
}
我刚刚过这个问题来了,下面的解决方案适用于所有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.
下面是所选答案的迅速解决。
我不能使用“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
}
}