Evento MKSnnotaionView tapgesture no se llama

Código:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { if (![view.annotation isKindOfClass:[MKUserLocation class]]) { CGSize imgSize; imgSize = [self getImageWidthHeight:[GRAPHICS MAP_ANNOTATION_DETAIL_BG]]; CGFloat Width = 0.0; CGFloat Height = 0.0; Width = imgSize.width; Height = imgSize.height; callview = [[JoltCalloutCustomView alloc]initWithFrame:CGRectMake((-Width/2) + (view.frameWidth/2), -Height, Width, Height)]; callview.tag = view.tag; NSDictionary *dicList = [m_arrShopList objectAtIndex:view.tag]; [callview.nameLabel setText:[dicList objectForKey:@"ShopName"]]; [callview.addressLbl setText:[dicList objectForKey:@"ShopStreet"]]; [callview.logoImageView setImage:[GRAPHICS LOGIN_BG_IMAGE]]; UITapGestureRecognizer *annotaionTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(annotationViewTapped:)]; // annotaionTapGesture.cancelsTouchesInView = NO; [callview addGestureRecognizer:annotaionTapGesture]; [view addSubview:callview]; } else{ [mapView deselectAnnotation:view.annotation animated:NO]; //hide callout for current location } } 

Agregué customView en AnnotationView. Agregué el evento tapGesture a customView. Cuando presiono el evento tapesture customView no recibí llamadas. ¿Qué hay de malo en mi código? Se agradecerá cualquier ayuda. Gracias por adelantado.

He encontrado uno creado una biblioteca para mostrar llamadas personalizadas.

Esto, te puede ser útil, @Sarheesh

DXCustomCallout-ObjC introduce la descripción del enlace aquí

¡Puede pasar cualquier vista personalizada para la llamada! También admite events para UIControls.

introduzca la descripción de la imagen aquí

De hecho, el gesto de toque de MKMapView tiene prioridad sobre el gesto de toque.

Puedes elegir la biblioteca de arriba propuesta por @Mehul o puedes manejar esto con las siguientes modificaciones.

En su controller de vista en el que está incluido el MKMapView (digamos ViewController.m), debe agregar un MKMapView personalizado que se podría llamar CustomMapView.

 @interface CustomMapView : MKMapView // This will probably be your JoltCalloutCustomView @property (strong, nonatomic) UIView *calloutView; - (void)hideCalloutViewAnimated:(BOOL)animated completion:(void (^)(BOOL finished))completion; - (void)showCalloutForAnnotationView:(MKAnnotationView *)annotationView animated:(BOOL)animated completion:(void (^)(BOOL finished))completion; @end 

Luego, al final de ViewController.m, agregue la siguiente implementación de su CustomMapView.

 #pragma mark - Custom Map View @interface MKMapView (UIGestureRecognizer) - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; @implementation CustomMapView - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIControl class]]) return NO; else return [super gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch]; } - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *calloutMaybe = [self.calloutView hitTest:[self.calloutView convertPoint:point fromView:self] withEvent:event]; if (calloutMaybe) return calloutMaybe; return [super hitTest:point withEvent:event]; } - (void)hideCalloutViewAnimated:(BOOL)animated completion:(void (^)(BOOL finished))completion { // Your implementation to hide the callout view } - (void)showCalloutForAnnotationView:(MKAnnotationView *)annotationView animated:(BOOL)animated completion:(void (^)(BOOL finished))completion { // Your implementation to show the callout view } @end 

Ahora, no olvide transformar su MKMapView en un CustomMapView.

Finalmente, en sus methods delegates de MKMapView, debería tener algo como esto.

 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { if ([view isKindOfClass:[MKUserLocation class]]) { [_mMapView showCalloutForAnnotationView:view animated:YES completion:nil]; } } - (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { if ([view isKindOfClass:[MKUserLocation class]]) { [_mMapView hideCalloutViewAnimated:YES completion:nil]; } } 

Lo siento, no tengo más time para explicarte en detalle todo el código, pero si tienes algún tipo de problema, avísame y te responderé lo antes posible;)

¡Que tengas un gran día!

Tom