在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)
}