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

标签 ios swift mapkit draggable mkannotationview

如何使用 Swift 中的 MapKit 使用户能够将注释从 map 中的一个位置拖动到另一个位置?当我的 map View 委托(delegate)创建注释 View 时,我已将注释 View 设置为可拖动,如下所示:

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
}

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

最佳答案

通过将 isDraggable 设置为 true 来标记注释 View 是不够的。您还必须在 map View 委托(delegate)中实现 mapView(_:annotationView:didChange:fromOldState:) - 并且(更重要的是)此实现不能为空! 相反,您的实现必须至少将拖动状态从传入参数传达给注释 View ,如下所示:

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 Swift MapKit 使注释可由用户拖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776853/

相关文章:

ios - 删除单元格导致崩溃

ios - 来自 CGRectMake 的 UIView 没有正确的高度

ios - 在 TextView 中渲染新行

ios - 为什么这种方法只在有人输入一个字符时有效?

ios - Socket IO Swift 客户端在连接后添加身份验证 header

ios - ios MKMapView 上的当前位置按钮

swiftui - 有人可以使用 SwiftUI+MapKit+LongPress 吗?

swift - MapKit 从坐标绘制折线 Swift 5

ios - Box API 身份验证 - Objective-c iOS

iphone - 嵌入 Youtube 视频警告