当我将一个子视图添加到MKMapView或它的任何后代视图时,触摸将直接通过并影响地图。
此问题最终用于解释为我的自定义标注修复的错误,该错误会为注释视图添加视图。触摸标注时不会解除标注,这个问题就是参考。但是为了简洁起见,我将使用一个更小的例子来证明这个问题。
设置exclusiveTouch和userInteractionEnabled不会执行任何操作。顺便说一句。
让我们拿一个UIView并将它附加到mapView
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]
view.backgroundColor = [UIColor blackColor];
[mapView addSubview:view];
让我们在地图上添加一个手势
[mapView addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]];
只需要handleLongPress打印一些NSLog(@“longpress”);现在运行程序并观察按下黑色uiview将导致longPress被触发的时间。如果我们添加一个显示标注的注释并选择它,则触摸黑色uiview将忽略它。如果我们滚动地图以使注释位于黑色uiview下,我们将能够选择注释。现在这是我的解决方案。我们将使用SOME_TAG标记我们要添加到mapview的视图,并覆盖MKMapView的hitTest方法
@interface MKMapView(HackySolution)
@end
@implementation MKMapView(HackySolution)
- (UIView *) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *view = [super hitTest:point withEvent:event];
// block touch propagation
if(view.tag == SOME_TAG){
view = nil;
}
return view;
}
@end
现在这是交易,我可能已经解决了我的问题,但我真的不知道为什么来自UIView的触摸正在传递到地图上。将子视图的触摸传递到它的parentView上是没有意义的。也许我不理解触摸是如何工作的。我的意思是,如果我在正常的UIView上放置一个按钮并在其上面放置另一个uiview,完全遮挡它,按钮就不能正常触摸?我开始猜测自己了。 :/
我只能猜测MKMapView是有线的,但我不确定。我以为MKMapView中有一个滚动视图,但是我浏览了所有子视图和所有后代,但没有找到任何内容。
有没有更好的方法来解决这个问题,或者这是最好的方法吗?
对此情况的任何见解将不胜感激。