2015-10-09 10 views
9

Sto lavorando con mapkit. Voglio che la mappa esegua lo zoom per mostrare la posizione dell'utente e il punto annotato, invece di eseguire lo zoom sulla posizione corrente dell'utente.Rendere lo zoom della mappa sulla posizione dell'utente e annotazione (swift 2)

Attualmente ho:

      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 
} 

si ingrandisce solo per la posizione dell'utente e viene bloccato sulla posizione. Quando provo a scorrere, si limita a tornare alla posizione dell'utente. Che cosa sto facendo di sbagliato? Come posso consentire all'utente di ingrandire o spostarsi sulla mappa senza tornare alla posizione corrente?

Sto cercando di ingrandire per mostrare l'annotazione e la posizione dell'utente sulla stessa vista. Anche se l'annotazione è lontana, desidero ingrandire per mostrare sia l'utente che l'annotazione.

risposta

10

Torna alla posizione dell'utente, perché il metodo didUpdateLocations viene chiamato più volte. Ci sono due soluzioni.

1) Utilizzare requestLocation

Se si utilizza requestLocation metodo invece di startUpdatingLocation, didUpdateLocations metodo viene chiamato solo una volta

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) Utilizzare bandiera

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 
    } 
} 
+0

Se si va con requestLocation, è necessario aggiungere anche una funzione in errore: 'func locationManager (manager: CLLocationManager, didFailWithError error: NSError) { // fare qualcosa } ' – Dohab

Problemi correlati