Uiview 停止MapView的子视图传播接触

Uiview 停止MapView的子视图传播接触,uiview,touch,mkmapview,Uiview,Touch,Mkmapview,当我将子视图添加到MKMapView或其任何子视图时,触摸将直接通过并影响贴图 这个问题最终用来解释一个错误,这个错误是为我的自定义标注修复的,该标注将视图添加到注释视图中。当触碰标注时,不得驳回标注,且该问题与该标注相关。但为了简单起见,我将使用一个较小的示例来演示这个问题 设置exclusiveTouch和userInteractionEnabled没有任何作用。顺便说一句 让我们创建一个UIView并将其附加到mapView UIView *view = [[UIView alloc] i

当我将子视图添加到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:)]];
就让我们用手印一些东西NSLog@longpress; 现在运行程序,观察按下黑色uiview会触发长按的时间。如果添加显示详图索引的注释并将其选中,则触摸黑色uiview将取消该注释。如果我们滚动地图,使注释位于黑色uiview下,我们将能够选择注释。现在这是我的解决方案。我们用一些_标记标记要添加到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中的某个地方有一个滚动视图,但我浏览了所有子视图和所有子视图,没有找到任何内容

有没有更好的方法来解决这个问题,或者这是最好的方法


如果您能深入了解情况,我们将不胜感激。

这里也有同样的问题。当我在UIButton中添加我的视图时,我注意到了一个差异,UIButton被添加到注释视图中,然后它就如预期的那样工作了。当我添加带有手势识别器的UIView时,识别器确实会向我发送触摸信息,但随后地图也会获得该信息并触发DIDDENSELECT。你是如何解决你的问题的?正如你刚才看到的那样。由于没有回应,我坚持我的黑客解决方案,如上图所示。好的,很高兴知道,谢谢。我确认当视图被包装在一个UIButton中时它是有效的,虽然它比较慢,但我真的不明白为什么。我觉得某个地方有个bug…嗯,你用仪器来计算什么占用了所有的cpu时间吗?我不知道如何使用仪器来获取信息。。。有什么提示吗?