2014-11-26 9 views
8

Jestem nowy w szybkim tempie (ogólnie programowanie w iOS) i próbuję znaleźć sposób powiększenia mapy tak, aby zmieścił się 2 punkty na mapie.Powiększyć, aby dopasować bieżące położenie i adnotację na mapie

Obecnie mam

var zoomRect = MKMapRectNull; 
var myLocationPointRect = MKMapRectMake(myLocation.longitude, myLocation.latitude, 0, 0) 
var currentDestinationPointRect = MKMapRectMake(currentDestination.longitude, currentDestination.latitude, 0, 0) 

zoomRect = myLocationPointRect; 
zoomRect = MKMapRectUnion(zoomRect, currentDestinationPointRect); 

która robi nic.

Czy muszę jakoś zastosować zoomRect do mapy?

+0

Nawiasem mówiąc, należy pamiętać, 'MKMapRectMake' akceptuje parametry typu' MKMapPoint' które są jednostki, które są _nie_ tak samo jak stopnie szerokości i długości geograficznej ('CLLocationDegrees'). Mimo że oba są podwójne, nie znajdują się w tych samych jednostkach. Aby przekonwertować z 'CLLocationCoordinate2D' na' MKMapPoint', użyj funkcji 'MKMapPointForCoordinate'. Ale jeśli używasz metody 'showAnnotations', nie musisz wykonywać tej konwersji ani ręcznie tworzyć' MKMapRect'. – Anna

+0

Zobacz http://stackoverflow.com/questions/4680649/zooming-mkmapview-to-fit-annotation-pins dla niektórych przykładów Celu-C. – Anna

Odpowiedz

4

MKMapRectUnion oblicza i zwraca nowy rect, nic więcej. Trzeba powiedzieć MapView ustawić swój widoczny obszar do tego nowego rect:

myMapView.setVisibleMapRect(zoomRect, animated: true) 
+0

Dzięki, to jest to –

+1

Pokazuje pionowy pasek bez adnotacji? –

0

-[MKMapView showAnnotations:animated:]

+0

Czy umieściłem to po moim kodzie? jest ten obiektywny kod c? –

+0

Tak, jest to sygnatura metody. Zasadniczo utwórz 'NSArray' zawierający twoje punkty, przekaż go jako pierwszy argument i podaj" BOOL "dla drugiego argumentu. – incanus

14
self.mapView.showAnnotations(self.mapView.annotations, animated: true) 
+0

Najlepsza odpowiedź! Pozostałe są zbyt skomplikowane, które wydawały się nie działać w pewnych sytuacjach. – Alan

0

Jak @lveselovsky powiedział

self.mapView.showAnnotations(self.mapView.annotations, animated: true) 

działa idealnie.

Jeśli aktualizowanie UI przed mapa została załadowana, można umieścić go w metodzie delegata tak:

func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) { 
    guard !mapZoomUpdatedOnce else { 
     return 
    } 

    self.mapView.showAnnotations(self.mapView.annotations, animated: true) 
    self.mapZoomUpdatedOnce = true 
} 

wartość logiczna tylko upewnić się kiedyś, że po raz pierwszy zaktualizowany, nie robi zaktualizuj ponownie, jeśli użytkownik nawiguje gdzie indziej na mapie :)

0

Swift 3 Dopasuj wszystkie adnotacje na mapie. To jest poprawna droga.

func zoomMapaFitAnnotations() { 

     var zoomRect = MKMapRectNull 
     for annotation in mapview.annotations { 

      let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) 

      let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0) 

      if (MKMapRectIsNull(zoomRect)) { 
       zoomRect = pointRect 
      } else { 
       zoomRect = MKMapRectUnion(zoomRect, pointRect) 
      } 
     } 
     self.mapview.setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(50, 50, 50, 50), animated: true) 

    } 
1

Dla szybkiej 3, iOS 10

Pobierz aktualną pozycję pierwszą, i za pomocą połączenia z powrotem didUpdateLocations skonfigurować mapę. Dodaj poniższy kod w kontrolerze widoku:

@IBOutlet weak var mapView: MKMapView! 

private var locationManager: CLLocationManager! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    mapView.delegate = self 

    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 

    if CLLocationManager.locationServicesEnabled() { 
     locationManager.requestWhenInUseAuthorization() 
     locationManager.startUpdatingLocation() 
    } 
} 



public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let last = newLocation { 
     let userlongitude = last.coordinate.longitude 
     let userlatitude = last.coordinate.latitude 
     let newDistance = CLLocation(latitude: userlatitude, longitude: userlongitude).distance(from: CLLocation(latitude: YourAnnotation.coordinate.latitude, longitude: YourAnnotation.coordinate.longitude)) 
     let region = MKCoordinateRegionMakeWithDistance(last.coordinate, 2 * newDistance, 2 * newDistance) 
     let adjustRegion = self.mapView.regionThatFits(region) 
     self.mapView.setRegion(adjustRegion, animated:true) 
    } 
} 
0

Zastosowanie poniżej MKMapView extension-

extension MKMapView 
{ 
    func fitAllMarkers(shouldIncludeCurrentLocation: Bool) { 

     if !shouldIncludeCurrentLocation 
     { 
      showAnnotations(annotations, animated: true) 
     } 
     else 
     { 
      var zoomRect = MKMapRectNull 

      let point = MKMapPointForCoordinate(userLocation.coordinate) 
      let pointRect = MKMapRectMake(point.x, point.y, 0, 0) 
      zoomRect = MKMapRectUnion(zoomRect, pointRect) 

      for annotation in annotations { 

       let annotationPoint = MKMapPointForCoordinate(annotation.coordinate) 
       let pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0) 

       if (MKMapRectIsNull(zoomRect)) { 
        zoomRect = pointRect 
       } else { 
        zoomRect = MKMapRectUnion(zoomRect, pointRect) 
       } 
      } 

      setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(8, 8, 8, 8), animated: true) 
     } 
    } 
} 
Powiązane problemy