UITableView 在不应该的时候将触摸事件传递给超级视图



在GIKAnimatedCallout示例代码中,双击手势、双指点击手势、缩放手势和捏手势都从UITableView传递到它下面的MKMapView。我想阻止这种情况发生。UITableView内的触摸事件不应传递到MKMapView上。

我尝试添加一个UIGestureRecognizer来进行敲击,并使其成为一个空方法,但这些触摸事件仍然会发送到MKMapView和UITableView。

通过调试器查看UITableView的超视图层次结构,我发现UITableView是MKMapView的后代。

我真的不知道该怎么处理这个问题。任何建议都将不胜感激。

如果我理解正确,如果在UITableView上做出手势,您希望MKMapView根本不做出反应(在本例中,myMKMapView的myTableView属性就是有问题的UITableView)。如果是这样,您应该实现

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; 

在MKMapView的子类中(如果你没有子类,就创建一个子类。在这个例子中,我称之为myMKMapView)。首先,让MKMapView的子类myMKMapView符合UIGestureRecognizerDelegate协议。在MKMapView的.h文件中:

@interface myMKMapView : MKMapView <UIGestureRecognizerDelegate>

完成后,进入myMKMapView的.m文件并实现以下内容:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    UIView *view = [self.view hitTest:[touch locationInView:self.view] withEvent:nil];
    if ([view isDescendantOfView:(self.myTableView)]) {
        return NO;
    }
    return YES;
}

此命令告诉myMKMapView,如果在其myTableView属性上执行手势,myMKMapView应忽略它。

Swift 5版Pedro Cattori的答案。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    !(view.hitTest(touch.location(in: view), with: nil)?.isDescendant(of: tableView) == true)
}

最新更新