从传播的触摸中停止MapView的子视图

时间:2012-12-22 03:39:16

标签: uiview touch mkmapview

当我将一个子视图添加到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中有一个滚动视图,但是我浏览了所有子视图和所有后代,但没有找到任何内容。

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

对此情况的任何见解将不胜感激。

0 个答案:

没有答案