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.
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
Esto dejó de funcionar en iOS7! donde polyView.path siempre es nulo! – Bach
Reemplazar MKPolygonView con MKPolygonRenderer: el primero estaba en desuso en iOS7 – guyh92