【问题标题】:iOS Swift MapKit making an annotation draggable by the user?iOS Swift MapKit 让用户可以拖动注释?
【发布时间】:2015-06-28 21:19:18
【问题描述】:

如何使用 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
}

结果是用户可以某种拖动注释 - 但只能拖动一次。之后,注释变得无法拖动,更糟糕的是,注释现在不再“属于”地图 - 当地图滚动/平移时,注释保持不动,而不是随着地图滚动/平移。我做错了什么?

【问题讨论】:

    标签: ios swift mapkit draggable mkannotationview


    【解决方案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
        }
    }
    

    一旦你这样做了,注释将被用户正确拖动。

    (非常感谢 this answer 如此清楚地解释这一点。我不能声称任何功劳!我在这里的回答只是将该代码翻译成 Swift。)

    【讨论】:

    • 这个解决方案是否仍然适用(iOS 11)?我遵循了解决方案,但永远不会调用 mapView(_:annotationView:didChange:fromOldState:) 方法。
    • @mert - 这个方法仍然被调用(虽然 MKAnnotationViewDragState 引用现在显然是 MKAnnotationView.DragState)。
    • 话虽如此,我一直在测试可追溯到 iOS 10 的各种设备中的可拖动注释,但似乎不需要这种方法。可能只在较旧的 iOS 版本中?
    • @Rob 是的,在我的书中,mapView(_:annotationView:didChange:fromOldState:) 的讨论已从最近几个版本中删除,因为不再需要。
    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多