3

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

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

通过调试器查看 UITableView 的 superview 层次结构,我看到 UITableView 是 MKMapView 的后代。

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

4

2 回答 2

4

如果我理解正确,如果在 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 应该忽略它。

于 2012-07-20T00:58:23.497 回答
0

Swift 5 版本的Pedro Cattori 的回答

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    !(view.hitTest(touch.location(in: view), with: nil)?.isDescendant(of: tableView) == true)
}
于 2021-10-03T15:01:17.327 回答