2011-06-22 7 views
9

En la aplicación que estoy diseñando tengo un MKMapView con superposiciones (personalizado MKPolylines btw) y me gustaría poder detectar eventos táctiles en estas superposiciones y asignar una acción específica a cada uno cubrir. ¿Alguien podría ayudarme en esto? Gracias!Touch events on MKMapView's overlays

Benja

Respuesta

0

Sólo en caso de que podría ayudar a algunos de ustedes ... no pude encontrar una manera de hacer eso, pero me añadido una anotación en mis enchapados (De todos modos, tenía que hacer eso para mostrar algo de información) y luego podría obtener el evento táctil en esta anotación. Sé que no es la mejor manera de hacerlo, pero en mi situación, y tal vez la tuya, funciona;)!

18

Esto se puede resolver combinando How to intercept touches events on a MKMapView or UIWebView objects? y How to determine if an annotation is inside of MKPolygonView (iOS). Añadir esto en 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 está en la primera respuesta vinculado. Llamar al mapView:viewForOverlay: no será barato, y agregar un caché local de esos ayudaría.

+0

Brillante. Este es exactamente el código que estaba buscando detectar al tocar en una superposición. Sin embargo, lo puse dentro del método llamado buy a tap gesture recogniser. Funciona bien sin tener que crear un interceptor personalizado. – drekka

+0

Esto dejó de funcionar en iOS7! donde polyView.path siempre es nulo! – Bach

+5

Reemplazar MKPolygonView con MKPolygonRenderer: el primero estaba en desuso en iOS7 – guyh92