Swift 3.0在MapView上放置注释

时间:2017-06-04 21:41:48

标签: ios swift annotations mkmapview

我设置了我的代码,这样长按mapView就可以让用户放下一个引脚。我想知道是否有一种方法可以允许用户输入注释的标题,这样按下注释后(一旦放置引脚),标题就会显示出来。

var locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    mapView.delegate = self
    let mapPress = UILongPressGestureRecognizer(target: self, action: #selector(AddressVC.addAnnotation(_:)))
    mapPress.minimumPressDuration = 1.5
    mapView.addGestureRecognizer(mapPress)
    }

func addAnnotation(_ recognizer: UIGestureRecognizer){
    let annotations = self.mapView.annotations
    self.mapView.removeAnnotations(annotations)
    let touchedAt = recognizer.location(in: self.mapView) // adds the location on the view it was pressed
    let newCoordinates : CLLocationCoordinate2D = mapView.convert(touchedAt, toCoordinateFrom: self.mapView) // will get coordinates

    let annotation = MKPointAnnotation()
    annotation.coordinate = newCoordinates
    self.mapView.addAnnotation(annotation)
}

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    if (annotation is MKUserLocation) {
        //if annotation is not an MKPointAnnotation (eg. MKUserLocation),
        return nil
    }
    let identifier = "pinAnnotation"
    if let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) {
        annotationView.annotation = annotation
        return annotationView
    } else {
        let annotationView = MKPinAnnotationView(annotation:annotation, reuseIdentifier: identifier)
        annotationView.isEnabled = true
        annotationView.canShowCallout = true

        return annotationView
    }
}

1 个答案:

答案 0 :(得分:1)

我建议使用UIAlertControllerUITextField用户输入名称。

import UIKit
import MapKit

class ViewController: UIViewController {

    @IBOutlet weak var map: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tap = UILongPressGestureRecognizer(target: self, action: #selector(self.createAnnotation))

        self.map.addGestureRecognizer(tap)
    }

    func createAnnotation(gesture: UILongPressGestureRecognizer){

        if gesture.state == .began {

            let point = gesture.location(in: self.map)

            let coordinate = self.map.convert(point, toCoordinateFrom: nil)

            let alertVC = UIAlertController(title: "Create Pin", message: "Enter a title for your pin.", preferredStyle: .alert)

            alertVC.addTextField { (textfield) in

                textfield.placeholder = "Enter a Title"

                textfield.autocapitalizationType = .words
            }

            alertVC.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

            alertVC.addAction(UIAlertAction(title: "Create", style: .default, handler: { (action) in

                guard

                    let textfield = alertVC.textFields?.first,

                    let text = textfield.text

                    else {

                        return
                }

                let pin = MKPointAnnotation()

                pin.title = text

                pin.coordinate = coordinate

                self.map.addAnnotation(pin)
            }))

            self.present(alertVC, animated: true, completion: nil)
        }
    }
}

Screenshot of UIAlertController