2010-10-22 21 views
11

Je travaille sans InterfaceBuilder.comment gérer glisser et déposer pour MKAnnotationView sur IOS?

J'ai une instance de MKAnnotationView avec setDraggable sur YES, Dans My MKMapView, ma vue d'annotation est affichée et je peux la faire glisser et la déposer. Comment puis-je exécuter une méthode lorsque l'action d'abandon est effectuée?

Dans cette méthode, j'ai besoin des nouvelles coordonnées de ma vue d'annotation.

Répondre

31

Si vous configurez AVONS votre objet MKAnnotation avec une méthode de setCoordinate correctement, dans la méthode didChangeDragState, la nouvelle coordonnée devrait déjà être l'objet d'annotation:

- (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); 
    } 
} 

Pour référence, voir le « Marquer La section "Affichage des annotations comme Draggable" dans le docs here. Si votre application doit fonctionner dans un système d'exploitation antérieur à la version 4.x, le glisser nécessite plus de travail manuel. Le lien dans les documents pointe également vers un exemple de la façon de le faire si nécessaire.

+0

Remerciez Je ne connaissais pas "didChangeDragState", et c'était exactement ce que je cherchais. –

5

vous pouvez également ajouter ce qui suit:

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

depuis MKAnnotationView ne change pas son état de glisser avec précision (qui pourrait rendre votre casserole carte avec l'annotation même après que vous arrêtez de glisser)