Как управлять перетаскиванием для MKAnnotationView на IOS? - PullRequest
11 голосов
/ 22 октября 2010

Я работаю без InterfaceBuilder.

У меня есть экземпляр MKAnnotationView с setDraggable на ДА , в Моем MKMapView отображается мой вид аннотациии я могу перетащить его.

Как выполнить метод, когда выполняется действие удаления?В этом методе мне нужны новые координаты моего представления аннотаций.

Ответы [ 3 ]

34 голосов
/ 22 октября 2010

Если вы правильно настроили объект MKAnnotation с помощью метода setCoordinate, то в методе didChangeDragState новая координата уже должна быть в объекте аннотации:

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

Для справки см. Раздел «Пометка аннотации как перетаскиваемый» в документах здесь . Если ваше приложение должно работать в операционной системе ранее 4.x, перетаскивание требует больше ручной работы. Ссылка в документации также указывает на пример того, как это сделать, если вам нужно.

7 голосов
/ 21 апреля 2014

Вы также можете добавить следующее:

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

, так как MKAnnotationView не меняет свое состояние перетаскивания точно (что может сделать вашу карту панорамой с вашей аннотацией даже после того, как вы перестанете перетаскивать)

1 голос
/ 29 декабря 2018

Быстрое решение:

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState)
    {
        if (newState == MKAnnotationViewDragState.ending)
        {
            let droppedAt = view.annotation?.coordinate
            print("dropped at : ", droppedAt?.latitude ?? 0.0, droppedAt?.longitude ?? 0.0);
            view.setDragState(.none, animated: true)    
        }
        if (newState == .canceling )
        {
            view.setDragState(.none, animated: true)           
        }
    }
...