Tocca MKAnnotationView per deselezionarlo e hide il callout

Ho un'app per iOS con annotazioni personalizzate.

  1. Voglio essere in grado di toccare una volta MKAnnotationView per mostrare il suo callout (funziona bene)
  2. e poi voglio toccare il MKAnnotationView una seconda volta per deselect l'annotazione e hide il callout per quell'annotazione (funziona in iOS5 ma non in iOS6).

Capisco che didSelectAnnotationView debba essere invocato solo per la selezione iniziale di un'annotazione. ([1]: Selezione di un'annotazione di MapView due volte ) e in base a questo articolo e ad altri che ho letto ([2]: i callout di ios mapkit che chiudono le didascalie toccando la mappa ), sembra come rilevare un ulteriore touch su un MKAnnotationView dopo è selezionato richiedono un UITapGestureReceachzer.

Quindi, sto usando un UITapGestureReceachzer e sto rilevando correttamente i tocchi aggiuntivi sulle mie viste di annotazione quando sono già selezionati, e sto chiamando deselectAnnotation quando riconosco il tap e sto nascondendo / deselezionando il callout / annotazione rispettivamente. Funziona alla grande in iOS5, ma funziona solo a metà su iOS6

In iOS6 viene richiamato il riconoscimento del gesto toccato, e chiamo il mio codice per hide il callout e deselect l'annotazione e tutto va bene, ma poi il metodo selectAnnotationView viene chiamato in qualche modo e così il mio callout si presenta di nuovo e la mia annotazione viene nuovamente selezionata.

Quello che presumo stia accadendo è che subito dopo che ho deselezionato la vista annotazione nel mio touch gesture receachzer, l'evento tap è ancora attivo, mapView rileva l'evento touch e invoca selectAnnotationView, e quindi l'annotazione che ho appena deselezionato viene ora selezionato di nuovo.

Non ho idea del motivo per cui accade solo in iOS6, ma spero di ricevere suggerimenti su qualsiasi altra idea per gestire il mio comportmento desiderato.

Solutions Collecting From Web of "Tocca MKAnnotationView per deselezionarlo e hide il callout"

Non so se hai ancora il tuo problema (spero non dal momento che il tuo post è un po 'vecchio). Ma nel caso in cui alcune persone avessero lo stesso problema, una soluzione per deselect l'annotazione ed evitare mapKit per riselezionarla è aggiungere un po 'di ritardo prima di deselect l'annotazione.

- (void)annotationTap:(UIGestureReceachzer *)gesture { MKAnnotationView *mkav = (MKAnnotationView *)gesture.view; //Add a small delay to deselect [self performSelector:@selector(deselectAnnotation:) withObject:mkav.annotation afterDelay:0.3]; [gesture.view removeGestureReceachzer:gesture]; } - (void)deselectAnnotation:(id<MKAnnotation>)annotation { [self.mapView deselectAnnotation:annotation animated:YES]; } 

E nel caso in cui l'utente deselezioni l'annotazione sulla mappa, tocca donMt forge per rimuovere il gesto con questo codice

 - (void) mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view { for (UIGestureReceachzer *receachzer in view.gestureReceachzers) { [view removeGestureReceachzer:receachzer]; } }