触摸MKMapView叠加层上的事件

时间:2011-06-22 07:36:28

标签: mkmapview overlay touch-event mkpolyline

在我正在设计的应用中,我有一个MKMapView覆盖它(自定义MKPolylines顺便说一句),我希望能够检测这些叠加层上的触摸事件并指定一个特定的每个叠加层的动作。有人可以帮我这个吗? 谢谢!

贝尼亚

2 个答案:

答案 0 :(得分:18)

这可以通过How to intercept touches events on a MKMapView or UIWebView objects?How to determine if an annotation is inside of 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:并不便宜,添加本地缓存会有所帮助。

答案 1 :(得分:0)

以防它们可能对你们有些帮助...... 我找不到办法做到这一点但是我在叠加上添加了一个注释(无论如何,我需要这样做以显示一些信息)然后我可以在这个注释上获得触摸事件。我知道这不是最好的方式,但在我的情况下,也许你的,它的工作;)!