当我将子视图添加到 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 的触摸会直接传递到地图上。对子视图的触摸传递到它的父视图是没有意义的。也许我不明白触摸是如何工作的。我的意思是,如果我在普通 UIView 上放置一个按钮,然后在其顶部放置另一个 uiview,完全遮盖它,那么按钮将无法触摸正确吗?我开始怀疑自己。:/
我只能猜测 MKMapView 是有线的,但我不确定。我以为 MKMapView 中的某个地方有一个滚动视图,但我浏览了所有子视图和所有后代,但没有找到任何东西。
有没有更好的方法来解决这个问题,或者这是最好的方法?
任何对这种情况的洞察力将不胜感激。