2015-04-21 18 views
10

Come posso rendere possibile l'utilizzo di MapKit in Swift per trascinare un'annotazione da una posizione all'altra all'interno della mappa? Ho impostato la vista annotazione di essere trascinato, quando il mio guarda la mappa delegato crea la vista annotazione, in questo modo:iOS Swift MapKit che rende un'annotazione trascinabile dall'utente?

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    var v : MKAnnotationView! = nil 
    if annotation is MyAnnotation { 
     let ident = "bike" 
     v = mapView.dequeueReusableAnnotationView(withIdentifier:ident) 
     if v == nil { 
      v = MyAnnotationView(annotation:annotation, reuseIdentifier:ident) 
     } 
     v.annotation = annotation 
     v.isDraggable = true 
    } 
    return v 
} 

Il risultato è che l'utente può sorta di trascinare l'annotazione - ma solo una volta. Dopodiché, l'annotazione diventa impossibile da trascinare, e ancora peggio, l'annotazione ora non è più "appartiene" alla mappa - quando la mappa viene spostata/spostata, l'annotazione rimane ferma invece di scorrere/panning con la mappa. Che cosa sto facendo di sbagliato?

risposta

17

Non è sufficiente contrassegnare la vista di annotazione impostando isDraggable su true. È necessario implementare anche mapView(_:annotationView:didChange:fromOldState:) nella delegazione della vista mappa e (ancora più importante) questa implementazione non deve essere vuota! Piuttosto, l'implementazione deve, come minimo, comunicare lo stato di trascinamento dai parametri in ingresso alla vista annotazione, in questo modo:

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) { 
    switch newState { 
    case .starting: 
     view.dragState = .dragging 
    case .ending, .canceling: 
     view.dragState = .none 
    default: break 
    } 
} 

Una volta fatto questo, l'annotazione sarà correttamente trascinabile dall'utente.

(Molte grazie a this answer per spiegare questo così chiaramente. Non posso richiedere alcun credito! La mia risposta qui è solo una traduzione di tale codice in Swift.)

+0

È questa soluzione ancora applicabili (iOS 11)? Ho seguito la soluzione, ma il metodo 'mapView (_: annotationView: didChange: fromOldState:)' non viene mai chiamato. – mert