在地图上重复引脚注释

Posted

技术标签:

【中文标题】在地图上重复引脚注释【英文标题】:Repeating pin annotation on map 【发布时间】:2016-01-12 23:10:37 【问题描述】:

我刚刚开始学习 Swift。

问题:

当我在地图上触摸以放置大头针注释并拖动手指时,它会创建重复的注释线。

import UIKit
import MapKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate 
    @IBOutlet weak var map: MKMapView!
    var manager:CLLocationManager!
    override func viewDidLoad() 
        super.viewDidLoad()
        //Manager for current location
        manager = CLLocationManager()
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()
        //Getting touch Gesture to add bookmark
        let uilpgr = UILongPressGestureRecognizer(target: self, action: "action:")
        uilpgr.minimumPressDuration = 1
        uilpgr.numberOfTouchesRequired = 1
        map.addGestureRecognizer(uilpgr)
    
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        let userLocation:CLLocation = locations[0]
        let latitude:CLLocationDegrees = userLocation.coordinate.latitude
        let longitude:CLLocationDegrees = userLocation.coordinate.longitude
        let latDelta:CLLocationDegrees = 0.002
        let lonDelta:CLLocationDegrees = 0.002
        let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
        let location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
        let region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)
        map.setRegion(region, animated: true)
    
    func action(gestureRecognizer: UIGestureRecognizer) 
        let touchPoint = gestureRecognizer.locationInView(self.map)
        let newCoordinate: CLLocationCoordinate2D = map.convertPoint(touchPoint, toCoordinateFromView: self.map)
        print(newCoordinate)
        let annotation = MKPointAnnotation()
        annotation.coordinate = newCoordinate
        annotation.title = "New Place"
        annotation.subtitle = "One day I'll go here..."
        map.addAnnotation(annotation)
    
    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

【问题讨论】:

【参考方案1】:

Xcode 8.2 • Swift 3.0.2

您只需要检查手势识别器状态并确保如果不是 .Began 返回。只需在您的操作方法顶部添加此 if 条件:

func action(_ gestureRecognizer: UIGestureRecognizer) 

    if gestureRecognizer.state != UIGestureRecognizerState.began 
        return
    

    //  your code

如果您希望允许用户在触摸时移动图钉,您需要切换手势识别器状态并在gestureRecognizer.state 发生变化时更新注释坐标:

func action(_ gestureRecognizer: UIGestureRecognizer) 
    switch gestureRecognizer.state 
    case .began:
        let annotation = MKPointAnnotation()
        annotation.coordinate = mapView.convert(gestureRecognizer.location(in: mapView), toCoordinateFrom: mapView)
        annotation.title =  "Untitled"
        mapView.addAnnotation(annotation)
    case .changed:
        if let annotation = (mapView.annotations.filter$0.title! == "Untitled" ).first as? MKPointAnnotation 
            annotation.coordinate =  mapView.convert(gestureRecognizer.location(in: mapView), toCoordinateFrom: mapView)
        
    case .cancelled:
        if let annotation = (mapView.annotations.filter$0.title! == "Untitled" ).first as? MKPointAnnotation 
            mapView.removeAnnotation(annotation)
        
    // you can also prompt the user here for the annotation title
    case .ended:
        if let annotation = (mapView.annotations.filter$0.title! == "Untitled" ).first as? MKPointAnnotation 
            let alert = UIAlertController(title: "New Annotation", message: "", preferredStyle: .alert)
            var inputTextField: UITextField?
            alert.addAction(UIAlertAction(title: "Add", style: .default)  _ in
                if  let annotationTitle = inputTextField?.text 
                    annotation.title =  annotationTitle
                    annotation.subtitle = "Lat:\(String(format: "%.06f", annotation.coordinate.latitude))  Lon:\(String(format: "%.06f", annotation.coordinate.longitude))"
                
            )
            alert.addTextField(configurationHandler:  textField in
                textField.placeholder = "Place Description"
                inputTextField = textField
            )
            alert.addAction(UIAlertAction(title: "Cancel", style: .cancel) _ in
                self.mapView.removeAnnotation(annotation)
            )
            present(alert, animated: true, completion: nil)
        
    default:
        print("default")
    

【讨论】:

以上是关于在地图上重复引脚注释的主要内容,如果未能解决你的问题,请参考以下文章

选择注释引脚时更改引脚颜色

删除按钮单击时的地图注释(创建注释)

iPhone 开发 - 是不是在可查看的地图区域中进行引脚注释

显示当前位置的引脚注释

iOS:地图视图注释未显示针脚

Swift MKMapView 引脚注释问题