MKMapView的覆盖层上的触摸事件

9
在我正在设计的应用程序中,我有一个带有覆盖层的MKMapView(自定义MKPolylines)。我想能够检测这些覆盖层上的触摸事件,并为每个覆盖层分配特定的动作。有谁能帮我解决这个问题吗? 谢谢! Benja
2个回答

19

可以通过结合如何拦截MKMapView或UIWebView对象上的触摸事件?如何确定注释是否在MKPolygonView (iOS)内部来解决。在viewWillAppear中添加以下内容:

WildcardGestureRecognizer * tapInterceptor = [[WildcardGestureRecognizer alloc] init];
tapInterceptor.touchesBeganCallback = ^(NSSet * touches, UIEvent * event) {
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.mapView];

    CLLocationCoordinate2D coord = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
    MKMapPoint mapPoint = MKMapPointForCoordinate(coord);
    for (id overlay in self.mapView.overlays) 
    {
        if ([overlay isKindOfClass:[MKPolygon class]])
        {
            MKPolygon *poly = (MKPolygon*) overlay;
            id view = [self.mapView viewForOverlay:poly];
            if ([view isKindOfClass:[MKPolygonView class]])
            {
                MKPolygonView *polyView = (MKPolygonView*) view;
                CGPoint polygonViewPoint = [polyView pointForMapPoint:mapPoint];
                BOOL mapCoordinateIsInPolygon = CGPathContainsPoint(polyView.path, NULL, polygonViewPoint, NO);   
                if (mapCoordinateIsInPolygon) {
                    debug(@"hit!") 
                } else {
                    debug(@"miss!");   
                }
            }
        }
    }

};
[self.mapView addGestureRecognizer:tapInterceptor];

WildcardGestureRecognizer 是第一个链接答案中的内容。调用 mapView:viewForOverlay: 方法并不便宜,添加一个本地缓存可以帮助提升性能。


注:原文中的"cheap"指代的是时间和计算成本较高,而非价格便宜。

太棒了。这正是我寻找的代码,用于检测覆盖层上的轻敲操作。不过我将其放在了一个名为“购买轻敲手势识别器”的方法中。没有必要创建自定义拦截器,它可以完美地工作。 - drekka
这在iOS7上停止工作了!其中polyView.path始终为nil! - Bach
5
用MKPolygonRenderer替换MKPolygonView - 前者在iOS7中已被弃用。 - guyh92

0

如果有需要的话,我分享一下我的经验... 我找不到直接实现这个功能的方法,但是我在我的覆盖层上添加了一个注释(无论如何,我需要这样做来显示一些信息),然后我就可以在这个注释上获取触摸事件了。我知道这不是最好的方法,但在我的情况下,也许在你的情况下,它能够起作用 ;)!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接