在地图上重复引脚注释
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")
【讨论】:
以上是关于在地图上重复引脚注释的主要内容,如果未能解决你的问题,请参考以下文章