iOS Mapkit Annotation不会变得可拖动

时间:2017-07-06 09:40:30

标签: ios swift mapkit mkannotation

我是iOS开发的新手,我需要在iOS地图中实现可拖动的注释。我的代码在下面给出。我做了什么我无法获得可拖动的注释任何人都可以帮助注释,之后我需要获取引脚指向的位置的地址

RegistrationViewController.swift

class RegistrationViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource,MKMapViewDelegate{
    @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        var centerLocation = CLLocationCoordinate2DMake(12.964370125970357, 77.59643554937497)
        var mapspan = MKCoordinateSpanMake(0.01, 0.01)
        var mapregion = MKCoordinateRegionMake(centerLocation, mapspan)
        self.mapView.setRegion(mapregion, animated: true)

        let pin = pinAnnotation(title:"hello",subtitle:"how are you",coordinate:centerLocation)
        mapView.addAnnotation(pin)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
        if annotation is MKPointAnnotation {
            let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
            pinAnnotationView.pinColor = .purple
            pinAnnotationView.isDraggable = true
            pinAnnotationView.canShowCallout = true
            pinAnnotationView.animatesDrop = true

            return pinAnnotationView
        }

        return nil
    }

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

pinAnnotation.swift

import MapKit

class pinAnnotation:NSObject,MKAnnotation {
    var title:String?
    var subtitle: String?
    var coordinate: CLLocationCoordinate2D
    init(title:String,subtitle:String,coordinate:CLLocationCoordinate2D) {
        self.title = title
        self.subtitle = subtitle
        self.coordinate = coordinate
    }
}

2 个答案:

答案 0 :(得分:2)

您可以通过将isDraggable属性设置为true来完成第一步。 现在,您只需要在用户停止拖动并删除注释时进行处理,请参阅: how to manage drag and drop for MKAnnotationView on IOS

此外,你的pinAnnotation应该有一个可设置的坐标。

来自Apple documentation

  

将注释视图标记为可拖动注释视图   内置拖动支持,这使得拖动非常容易   地图周围的注释并确保注释数据   相应更新。实现对拖动的最小支持:

     

在注释对象中,实现setCoordinate:方法   允许地图视图更新注释的坐标点。什么时候   创建注释视图,将其draggable属性设置为YES。什么时候   用户触摸并保持可拖动的注释视图,即地图视图   开始拖动操作。随着拖动操作的进行,   地图视图调用   mapView:annotationView:didChangeDragState:fromOldState:其方法   委托通知它视图拖动状态的变化。您   可以使用此方法来影响或响应拖动操作。

     

要在拖动操作期间为视图设置动画,请实现自定义   注释视图中的dragState方法。作为地图视图处理   拖动相关的触摸事件,它更新了dragState属性   受影响的注释视图。实现自定义dragState方法给出   你有机会拦截这些变化并执行额外的更改   动作,例如动画视图的外观。例如,   当拖动时,MKPinAnnotationView类会将引脚从地图上抬起   操作开始并在结束时将引脚向下放回地图上。

您缺少mapView:annotationView:didChangeDragState:fromOldState:方法

答案 1 :(得分:2)

在您的情况下,annotation不是MKPointAnnotation类型。这就是为什么它没有进入if annotation is MKPointAnnotation {状态。

应该是这样的:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation is pinAnnotation {

        let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
        pinAnnotationView.pinTintColor = .purple
        pinAnnotationView.isDraggable = true
        pinAnnotationView.canShowCallout = true
        pinAnnotationView.animatesDrop = true

        return pinAnnotationView
    }

    return nil
}

因为annotationpinAnnotation类型。

我在代码中看不到mapView.delegate = self。但是如果你通过故事板分配它,那就好了,否则用viewDidLoad方法添加它。

您的完整代码将是:

import UIKit
import MapKit

class ViewController: UIViewController,MKMapViewDelegate{
    @IBOutlet weak var mapView: MKMapView!


    override func viewDidLoad() {
        super.viewDidLoad()
        mapView.delegate  = self
        let centerLocation = CLLocationCoordinate2D(latitude: 12.964370125970357, longitude: 77.59643554937497)
        let mapspan = MKCoordinateSpanMake(0.01, 0.01)
        let mapregion = MKCoordinateRegionMake(centerLocation, mapspan)
        self.mapView.setRegion(mapregion, animated: true)

        let pin = pinAnnotation(title:"hello",subtitle:"how are you",coordinate:centerLocation)
        mapView.addAnnotation(pin)

    }


    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

        if annotation is pinAnnotation {

            let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
            pinAnnotationView.pinTintColor = .purple
            pinAnnotationView.isDraggable = true
            pinAnnotationView.canShowCallout = true
            pinAnnotationView.animatesDrop = true

            return pinAnnotationView
        }

        return nil
    }

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

修改

您可以使用view.annotation?.coordinate

获取新位置

检查以下代码:

func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
    switch newState {
    case .starting:
        view.dragState = .dragging
    case .ending, .canceling:
        //New cordinates
        print(view.annotation?.coordinate)
        view.dragState = .none
    default: break
    }
}