我刚开始学习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.
}
}
答案 0 :(得分:1)
Xcode 8.2•Swift 3.0.2
您只需要检查手势识别器状态,并确保是否.Began返回。只需在操作方法的顶部添加if 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")
}
}