如何使用 swift 2 和 xcode 7 在 MapKit 中使注释点可拖动?

How to make annotation point draggable in MapKit using swift 2 and xcode 7?

找到这个问题的解决方案非常令人沮丧。我发布了整个代码以了解问题。请帮忙

import UIKit
import MapKit
import CoreLocation
class LocationViewController: UIViewController,MKMapViewDelegate, CLLocationManagerDelegate {


    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()
    var annotationPoint: MKPointAnnotation!
    var getMovedMapCenter: CLLocation!
    var myPinView:MKPinAnnotationView!
    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        if #available(iOS 8.0, *) {
            self.locationManager.requestWhenInUseAuthorization()
        } else {
            // Fallback on earlier versions
        }
        self.locationManager.startUpdatingLocation()
        self.mapView.showsUserLocation = true

        // Do any additional setup after loading the view.
    }

    // MARK: - Location Delegate Methods

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        let location = locations.last

        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)

        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1))

        self.mapView.setRegion(region, animated: true)

        if(self.annotationPoint == nil)
        {
            self.annotationPoint = MKPointAnnotation()
            getMovedMapCenter =  CLLocation(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)

             self.annotationPoint.coordinate = getMovedMapCenter.coordinate

            // self.annotationPoint.title = location_value
            //self.annotationPoint.subtitle = ""

            // println_debug(self.annotationPoint)

            self.mapView.addAnnotation(self.annotationPoint)

        }

        self.locationManager.stopUpdatingLocation()
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
    {
        print("Errors: " + error.localizedDescription)
    }

    //MARK:- View for Annotation
    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
    {
        if annotation is MKPointAnnotation {
            let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")

            pinAnnotationView.pinColor = .Purple
            pinAnnotationView.draggable = true
            pinAnnotationView.canShowCallout = true
            pinAnnotationView.animatesDrop = true

            return pinAnnotationView
        }

        return nil
    }

    //MARK:- Annotation Changed State

    func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {

        print("hiii")


        //        println_debug("End State coordinates: \(self.annotationPoint.coordinate.latitude),\(self.annotationPoint.coordinate.longitude)")


        if(newState == .Ending)
        {


            let center = CLLocationCoordinate2D(latitude: self.annotationPoint.coordinate.latitude, longitude: self.annotationPoint.coordinate.longitude)
            //    self.currentLocationNameA(center)

            //            dispatch_async(GlobalBackgroundQueue)
            //                {
            //
            //
            //            }
        }

    }

    //MARK:- update Not Get

    func mapView(mapView: MKMapView,
        didFailToLocateUserWithError error: NSError)
    {
        // AppHelper.showALertWithTag(121, title: APP_NAME, message: "Failed to get location. Please check Location setting", delegate: nil, cancelButtonTitle: "Ok", otherButtonTitle: nil)

    }




}

我被这段代码卡住了。因为 didChangeDragState Delegate 从未调用过。请帮助我为此找到更好的解决方案。我是 swift 的新手;所以很难将objective c代码转换成swift

   if (annotation is MKUserLocation) {
        return nil
    }

    let reuseId12 = "pin12"

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)

    if pinView == nil {
        pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId12)
        pinView.image = UIImage(named:"pin-1250.png")
        pinView.canShowCallout = false
        pinView.draggable = true
    }
    else {

        pinView.annotation = annotation
    }

    return pinView

试试这个代码。

The drag state typically changes in response to user interactions with the annotation view. However, the annotation view itself is responsible for changing that state as well.

替换此方法并尝试一次。可能工作正常

func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
    switch (newState) {
    case .Starting:
        view.dragState = .Dragging
    case .Ending, .Canceling:
        view.dragState = .None
    default: break
    }
}

用这个替换你的点标注方法

let pa = MKPointAnnotation()
pa.coordinate = placemark.location.coordinate
pa.title = placemark.name //or whatever title you like
self.mapView.addAnnotation(pa)

更多可以看Code and Another Sample Code

 pinAnnotationView.canShowCallout = false

这一行解决了我的问题。显示 "current location" 的弹出窗口是导致此问题的主要原因。

代码中的这些更改使拖动变得顺畅。 Mehul 和 Vijay Answer 帮助我找到了这个解决方案。

func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
        switch (newState) {
        case .Ending, .Canceling:
            view.dragState = .None
        default: break
        }
    }