2010-10-22 19 views
11

Sto lavorando senza InterfaceBuilder.come gestire il drag and drop per MKAnnotationView su IOS?

Ho un'istanza di MKAnnotationView con setDraggable su SÌ, In My MKMapView viene visualizzata la mia vista di annotazione e posso trascinarla e rilasciarla.

Come è possibile eseguire un metodo quando viene eseguita l'azione di rilascio? In questo metodo ho bisogno dei nuovi coordonati della mia vista di annotazione.

risposta

31

Se si imposta'VE l'oggetto MKAnnotation con un metodo setCoordinate correttamente, quindi nel metodo didChangeDragState, la nuova coordinata dovrebbe essere già nell'oggetto della nota:

- (void)mapView:(MKMapView *)mapView 
     annotationView:(MKAnnotationView *)annotationView 
     didChangeDragState:(MKAnnotationViewDragState)newState 
     fromOldState:(MKAnnotationViewDragState)oldState 
{ 
    if (newState == MKAnnotationViewDragStateEnding) 
    { 
     CLLocationCoordinate2D droppedAt = annotationView.annotation.coordinate; 
     NSLog(@"dropped at %f,%f", droppedAt.latitude, droppedAt.longitude); 
    } 
} 

Per riferimento, vedere il "Contrassegno Sezione "Vista annotabile trascinabile" nello docs here. Se la tua app deve funzionare in un sistema operativo precedente alla 4.x, il trascinamento richiede più lavoro manuale. Il link nel documento indica anche un esempio di come farlo se necessario.

+0

Grazie tu non sapevo "didChangeDragState", ed era esattamente quello che stavo cercando. –

5

si consiglia inoltre di aggiungere il seguente:

if (newState == MKAnnotationViewDragStateStarting) { 
    annotationView.dragState = MKAnnotationViewDragStateDragging; 
} 
else if (newState == MKAnnotationViewDragStateEnding || newState == MKAnnotationViewDragStateCanceling) { 
    annotationView.dragState = MKAnnotationViewDragStateNone; 
} 

poiché MKAnnotationView non cambia il suo stato di trascinamento in modo accurato (che potrebbe rendere la vostra mappa padella con l'annotazione anche dopo aver smesso il trascinamento)