2015-10-09 7 views
9

Pracuję z mapkit. Chcę, aby mapa była powiększana, aby pokazać lokalizację użytkownika i punkt z adnotacjami, zamiast tylko przybliżać bieżącą lokalizację użytkownika.Dokonywanie powiększenia mapy do lokalizacji użytkownika i adnotacji (Swift 2)

Obecnie mam:

      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 
} 

To tylko przybliża do lokalizacji użytkownika i zostanie zablokowana na miejscu. Kiedy próbuję przewinąć, po prostu przeskakuje z powrotem do lokalizacji użytkownika. Co ja robię źle? Jak zezwolić użytkownikowi na powiększanie lub przesuwanie mapy bez powrotu do bieżącej lokalizacji?

Próbuję powiększyć, aby wyświetlić adnotację i lokalizację użytkownika w tym samym widoku. Nawet jeśli adnotacja jest daleko, chcę ją powiększyć, aby pokazać zarówno użytkownika, jak i adnotację.

Odpowiedz

10

Po prostu przeskakuje z powrotem do lokalizacji użytkownika, ponieważ metoda didUpdateLocations jest wywoływana wiele razy. Istnieją dwa rozwiązania.

1) Użyj requestLocation

Jeśli używasz requestLocation metodę zamiast startUpdatingLocation, didUpdateLocations metoda jest wywoływana tylko raz

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) Użyj flagę

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

Jeśli pójdziesz z requestLocation, musisz dodać także funkcję failing: 'func locationManager (manager: CLLocationManager, didFailWithError error: NSError) { // zrobienie czegoś } ' – Dohab

Powiązane problemy