Как управлять перетаскиванием для MKAnnotationView на IOS?

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

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

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

Ответ 1

Если вы правильно настроили объект 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);
    }
}

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

Ответ 2

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

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

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