Ignorer mapView: didSelectAnnotationView lorsque la pression est longue

Je me bats avec celui-ci. J'ai une carte avec de nombreuses épingles dans une petite zone. Je veux ignorer la sélection d'une annotation par mapview lorsque j'appuie longuement sur la carte, même si j'appuie sur une vue d'annotation. Il semble que l'annotation soit sélectionnée sur un TouchDown, plutôt que de la retoucher sur la vue d'annotation, ce qui est gênant.

J'ai ajouté un geste longpress à la mapview:

UILongPressGestureRecognizer *longRec = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(addPin:)]; longRec.cancelsTouchesInView = YES; [self.mapView addGestureRecognizer:longRec]; 

Cela n'est pas reconnu lorsque j'appuie longuement sur une vue d'annotation. Dès que j'appuie sur la touche, l'appel de délégation d'annotation select est traité et la pression longue ne se triggers jamais.

J'ai essayé de bloquer le système de reconnaissance gestuelle, qui bien sûr ne fonctionne pas parce que les gestes de mapview ne sont pas delegates à mon controller de carte, donc cela ne fonctionne pas:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) { return NO; } return YES; } 

J'ai également essayé d'append un geste longpress à la vue d'annotation comme un hack, mais cela ne se triggers jamais non plus, et je n'aime pas cette stratégie de toute façon.

Existe-t-il un moyen de bloquer la sélection d'annotations de mapview lorsqu'un mouvement longpress est en attente sur la carte?

Conçu une solution. Fondamentalement en sous-classant MKMapView et en implémentant handleTap et handleLongPress.

Là, je bloque un robinet pendant une longue pression. Je donne également un peu de retard pour gérer le cas où les deux gestes sont reconnus simultanément:

 @implementation KWMapView // :MKMapView - (void)handleTap:(UITapGestureRecognizer *)tapGesture { CGPoint tapPoint = [tapGesture locationInView:self]; NSUInteger numberOfTouches = [tapGesture numberOfTouches]; if (numberOfTouches == 1 && tapGesture.state == UIGestureRecognizerStateEnded) { if (!self.blockTap) { id v = [self hitTest:tapPoint withEvent:nil]; if ([v isKindOfClass:[MKAnnotationView class]]) { [self addAnnotation:[v annotation]]; [self selectAnnotation:[v annotation] animated:YES]; } else { [[NSNotificationCenter defaultCenter] postNotificationName:PNMapViewDidTapMap object:tapGesture]; } } } } - (void)handleLongPress:(UILongPressGestureRecognizer*)sender { self.blockTap = YES; if (sender.state == UIGestureRecognizerStateBegan) { [[NSNotificationCenter defaultCenter] postNotificationName:PNMapViewDropPinGesture object:sender]; } if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed) { double delayInSeconds = .2; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ self.blockTap = NO; }); } } @end 

la vue annotion possède une propriété appelée enabled, vous pouvez la définir sur NO afin qu'elle ne réagisse pas à un événement tactile lors de la présentation des informations que vous souhaitez afficher.