Determine si MKMapView se arrastró / movió en Swift 2.0

¿Cómo puedo detectar cuándo el usuario ha arrastrado o movido un MKMapView para, por ejemplo, evitar la localización automática en la location actual del usuario.

Nota: esta respuesta fue posible y se adaptó de la respuesta de Jano a la misma pregunta para Objective-C aquí: determine si MKMapView fue arrastrado / movido . Gracias jano

Para detectar correctamente un arrastre del map, debe agregar un UIPanGestureRecognizer. Este es el gestor de reconocimiento de arrastrar (panning = arrastrar).

Paso 1: agregue el reconocimiento de gestos en viewDidLoad (Swift 2)

override func viewDidLoad() { super.viewDidLoad() // All your other setup code let mapDragRecognizer = UIPanGestureRecognizer(target: self, action: "didDragMap:") mapDragRecognizer.delegate = self self.mapView.addGestureRecognizer(mapDragRecognizer) } 

Versión Swift 3 de la configuration del reconocedor de gestos anterior (la syntax del selector ha cambiado)

 override func viewDidLoad() { super.viewDidLoad() let mapDragRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.didDragMap(gestureRecognizer:))) mapDragRecognizer.delegate = self self.mapView.addGestureRecognizer(mapDragRecognizer) } 

Paso 2: Agregue el protocolo UIGestureRecognizerDelegate al controller de vista para que funcione como delegado.

 class MapViewController: UIViewController, UIGestureRecognizerDelegate 

Paso 3: agregue el siguiente código para que UIPanGestureRecognizer funcione con los reconocedores de gestos ya existentes en MKMapView:

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true } 

Paso 4: en caso de que quiera llamar a su método una vez 50 veces por arrastre, detecte el estado de "arrastre terminado" o "arrastre comenzó" en su selector:

 func didDragMap(gestureRecognizer: UIGestureRecognizer) { if (gestureRecognizer.state == UIGestureRecognizerState.Began) { print("Map drag began") } if (gestureRecognizer.state == UIGestureRecognizerState.Ended) { print("Map drag ended") } } 

Espero que esto ayude a alguien necesitado.