Haciendo que el zoom del map a la location del usuario y la anotación (swift 2)

Estoy trabajando con mapkit. Quiero que el map se acerque para mostrar la location del usuario y el punto anotado, en lugar de hacer un zoom a la location actual del usuario.

Actualmente tengo:

let annotation = MKPointAnnotation() annotation.coordinate = CLLocationCoordinate2DMake(mapLat, mapLon) annotation.title = mapTitle self.map.addAnnotation(annotation) func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let userLoction: CLLocation = locations[0] let latitude = userLoction.coordinate.latitude let longitude = userLoction.coordinate.longitude let latDelta: CLLocationDegrees = 0.05 let lonDelta: CLLocationDegrees = 0.05 let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta) let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude) let region: MKCoordinateRegion = MKCoordinateRegionMake(location, span) self.map.setRegion(region, animated: true) self.map.showsUserLocation = true } 

Simplemente se acerca a la location del usuario y se bloquea en la location. Cuando trato de desplazarme, simplemente salta de return a la location del usuario. ¿Qué estoy haciendo mal? ¿Cómo permito que el usuario amplíe o mueva el map sin que vuelva a la location actual?

Estoy intentando hacer zoom para mostrar la anotación y la location del usuario en la misma vista. Incluso si la anotación está muy lejos, quiero que haga zoom para mostrar tanto el usuario como la anotación.

Simplemente salta de return a la location del usuario, porque el método didUpdateLocations se didUpdateLocations muchas veces. Hay dos soluciones

1) Use requestLocation

Si usa el método requestLocation lugar de startUpdatingLocation , el método didUpdateLocations se didUpdateLocations solo una vez

 if #available(iOS 9.0, *) { locationManager.requestLocation() } else { // Fallback on earlier versions } func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let userLoction: CLLocation = locations[0] let latitude = userLoction.coordinate.latitude let longitude = userLoction.coordinate.longitude let latDelta: CLLocationDegrees = 0.05 let lonDelta: CLLocationDegrees = 0.05 let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta) let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude) let region: MKCoordinateRegion = MKCoordinateRegionMake(location, span) self.map.setRegion(region, animated: true) self.map.showsUserLocation = true } 

2) Usar bandera

 var isInitialized = false func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { if !isInitialized { // Here is called only once isInitialized = true let userLoction: CLLocation = locations[0] let latitude = userLoction.coordinate.latitude let longitude = userLoction.coordinate.longitude let latDelta: CLLocationDegrees = 0.05 let lonDelta: CLLocationDegrees = 0.05 let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta) let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude) let region: MKCoordinateRegion = MKCoordinateRegionMake(location, span) self.map.setRegion(region, animated: true) self.map.showsUserLocation = true } }