IOS Swift MapKit делает аннотацию, перетаскиваемую пользователем?

Как сделать возможным использование MapKit в Swift для того, чтобы пользователь мог перетащить аннотацию из одной позиции в другую на карте? Я установил представление аннотации для перетаскивания, когда делегат представления представления карты создает аннотацию, например:

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
}

В результате пользователь может сортировать аннотацию, но только один раз. После этого аннотацию становится невозможно перетащить, и, что еще хуже, аннотация теперь больше не "принадлежит" для карты - когда карта прокручивается/подкрашивается, аннотация сохраняется, а не прокручивается/панорамируется с помощью карты. Что я делаю неправильно?

Ответ 1

Недостаточно отметить аннотацию, установив isDraggable в true. Вы также должны реализовать mapView(_:annotationView:didChange:fromOldState:) в своем делете делегата карты - и (что еще более важно) эта реализация не должна быть пуста! Скорее, ваша реализация должна, как минимум, передавать состояние перетаскивания из входящих параметров в представление аннотации, например:

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
    }
}

Как только вы это сделаете, аннотация будет правильно перетаскиваться пользователем.

(Большое спасибо этому ответу, чтобы объяснить это так ясно. Я не могу претендовать на кредит! Мой ответ здесь - это просто перевод этого кода в Свифт. )