2012-03-14 10 views
11

Ecco cosa voglio: l'utente tocca la mappa, il mio codice viene eseguito e quindi il codice di sistema viene eseguito (se l'utente ha fatto clic sul callout di annotazione è presentato ecc ...).Come posso prendere tap su MapView e quindi passarlo ai riconoscitori di gesti predefiniti?

ho aggiunto semplice riconoscitore di rubinetto alla cartina:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapViewTapped:)]; 
[self.mapView addGestureRecognizer:tapGestureRecognizer]; 
[tapGestureRecognizer release]; 

All'interno mapViewTapped mio codice Viene eseguito. Ora voglio avvisare il codice di sistema di toccare (ad esempio per mostrare callout). Come lo faccio? Come passare l'evento che ho intercettato?

risposta

23

Un modo è quello di implementare il metodo UIGestureRecognizerDelegategestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: e tornare YES in esso:

//add <UIGestureRecognizerDelegate> to .h to avoid compiler warning 

//add this where you create tapGestureRecognizer... 
tapGestureRecognizer.delegate = self; 

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

Ora il vostro mapViewTapped: verrà chiamato e poi riconoscitore del guarda la mappa sarà chiamare il suo metodo. Se il tocco era su una vista annotazione, la vista mappa mostrerà il suo callout (e il metodo delegato didSelectAnnotationView verrà chiamato se lo hai implementato).


Un altro modo, se avete bisogno di un maggiore controllo, quindi invece di fare quanto sopra, nel vostro mapViewTapped: è possibile controllare se il rubinetto era su una vista annotazione e quindi selezionare manualmente l'annotazione che sarà poi mostrare la sua didascalia (e chiamare il metodo didSelectAnnotationView delegato):

-(void)mapViewTapped:(UITapGestureRecognizer *)tgr 
{ 
    CGPoint p = [tgr locationInView:mapView]; 

    UIView *v = [mapView hitTest:p withEvent:nil]; 

    id<MKAnnotation> ann = nil; 

    if ([v isKindOfClass:[MKAnnotationView class]]) 
    { 
     //annotation view was tapped, select it... 
     ann = ((MKAnnotationView *)v).annotation; 
     [mapView selectAnnotation:ann animated:YES]; 
    } 
    else 
    { 
     //annotation view was not tapped, deselect if some ann is selected... 
     if (mapView.selectedAnnotations.count != 0) 
     { 
      ann = [mapView.selectedAnnotations objectAtIndex:0]; 
      [mapView deselectAnnotation:ann animated:YES]; 
     } 
    } 
} 
+0

grazie, la tua spiegazione è non solo utile, ma molto dettagliate – MegaManX

+1

Molte grazie, il tuo secondo suggerimento era esattamente quello che cercavo! – MrDB

+0

Ottimo suggerimento, era quello che stavo cercando –

Problemi correlati