iOS Swift MapKit使用户可以拖动注释吗?

时间:2015-04-21 15:38:12

标签: ios swift mapkit draggable mkannotationview

如何使用Swift中的MapKit让用户在地图中将注释从一个位置拖到另一个位置?我将注释视图设置为可拖动,当我的地图视图委托创建注释视图时,如下所示:

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 个答案:

答案 0 :(得分:25)

通过将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
    }
}

一旦这样做,用户就可以正确地拖动注释。

(非常感谢this answer如此清楚地解释这一点。我无法申请任何功劳!我的答案仅仅是将该代码翻译成Swift。)