Swift 3.0在MapView上放置一个注解

问题描述:

我有我的代码设置,这样长按mapView将允许用户放下一个pin。我想知道是否有一种方法可以允许用户输入注释的标题,这样在按下注释之后(一旦插入注释),标题就会显示出来。Swift 3.0在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 
    } 
} 

我建议使用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

+0

这个效果一样好,因为我想要的! – Kevin