UITableView 在不应该的情况下将触摸事件传递给超级视图

rya*_*hee 4 cocoa-touch gesture-recognition mapkit ios

GIKAnimatedCallout示例代码中,双击手势、两指点击手势、缩放手势和捏合手势都从 UITableView 传递到其下面的 MKMapView。我想阻止这一切发生。UITableView 内的触摸事件不应传递到 MKMapView。

我尝试为点击添加 UIGestureRecognizer,并将其设为空方法,但这些触摸事件仍会发送到 MKMapView 以及 UITableView。

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

我真的不知道如何解决这个问题。任何指示表示赞赏。

Ped*_*ori 5

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

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; 
Run Code Online (Sandbox Code Playgroud)

在您的 MKMapView 子类中(如果您没有子类,则创建一个子类。在本例中我将子类称为 myMKMapView)。首先使 MKMapView 的子类 myMKMapView 符合该UIGestureRecognizerDelegate协议。在 MKMapView 的 .h 文件中:

@interface myMKMapView : MKMapView <UIGestureRecognizerDelegate>
Run Code Online (Sandbox Code Playgroud)

完成此操作后,进入 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;
}
Run Code Online (Sandbox Code Playgroud)

这告诉 myMKMapView 如果对其 myTableView 属性执行手势,myMKMapView 应忽略它。