如何使用Swift(IOS)实现可拖动的MKPointAnnotation?

7
我是iOS的新手,我需要使用Swift在MKMapView中实现一个可拖拽的MKPointAnnotation。请提供一个示例。我已经在地图上实现了MKMapView,并添加了一个MKPointAnnotation(addAnnotation)。
我的英语不好,请帮帮我!
我找到了这个链接,但是我没有理解:link
2个回答

9
您需要创建一个自定义类,继承自MKMapView。这个类必须实现MKMapViewDelegate协议。
然后您需要2个步骤:创建注释对象和为该注释创建视图。
创建注释:
在您的代码中某处,根据您的需求:
let annotation = MKPointAnnotation()
annotation.setCoordinate(location)  // your location here
annotation.title = "My Title"
annotation.subtitle = "My Subtitle"

self.mapView.addAnnotation(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
}

4

以下是我的示例代码。此代码允许您长按地图以添加一个点,并拖动该点直到您从屏幕上释放手指。还请注意要在地图视图上添加的gestureRecognizer手势识别器。希望这能帮助您。

class TravelLocationMapController: UIViewController, MKMapViewDelegate {


@IBOutlet var mapView: MKMapView!

var dragPin: MKPointAnnotation!

override func viewDidLoad() {
    super.viewDidLoad()

    mapView.delegate = self
    let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "addPin:")
    gestureRecognizer.numberOfTouchesRequired = 1

    mapView.addGestureRecognizer(gestureRecognizer)
}

func addPin(gestureRecognizer:UIGestureRecognizer){
    let touchPoint = gestureRecognizer.locationInView(mapView)
    let newCoordinates = mapView.convertPoint(touchPoint, toCoordinateFromView: mapView)
    if dragPin != nil {
        dragPin.coordinate = newCoordinates
    }

    if gestureRecognizer.state == UIGestureRecognizerState.Began {
        dragPin = MKPointAnnotation()
        dragPin.coordinate = newCoordinates
        mapView.addAnnotation(dragPin)
    } else if gestureRecognizer.state == UIGestureRecognizerState.Ended {            
        dragPin = nil
    }
}

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

        pinAnnotationView.pinTintColor = UIColor.purpleColor()
        pinAnnotationView.animatesDrop = true

        return pinAnnotationView
    }
    return nil
}

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) {
    let lat = view.annotation?.coordinate.latitude
    let long = view.annotation?.coordinate.longitude

    print("Clic pin lat \(lat) long \(long)")

}

太好了,谢谢!你应该在“mapView(_:viewForAnnotation)”中使用“mapView.dequeueReusableAnnotationViewWithIdentifier("myPin")”获取现有的“MKPinAnnotationView”。 - brki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接