2014-11-26 7 views
8

Ich bin neu zu swift (iOS-Programmierung im Allgemeinen) und versuche herauszufinden, wie man eine Karte herauszoomen, um 2 Punkte auf der Karte zu passen.Zoomen, um den aktuellen Standort und Anmerkungen auf Karte zu passen

Zur Zeit habe ich

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); 

die nichts tut.

Muss ich irgendwie auf die Karte zoomRect anwenden?

+0

By the way, beachten Sie bitte 'MKMapRectMake' akzeptiert Parameter vom Typ' MKMapPoint', die Einheiten sind, die _nicht_ die sind wie Breiten- und Längengrade ('CLLocationDegrees'). Obwohl beide Doppel sind, sind sie nicht in den gleichen Einheiten. Um von 'CLLocationCoordinate2D' nach' MKMapPoint' zu konvertieren, verwenden Sie die Funktion 'MKMapPointForCoordinate'. Wenn Sie jedoch die 'showAnnotations'-Methode verwenden, müssen Sie diese Konvertierung nicht manuell durchführen oder ein' MKMapRect' manuell erstellen. – Anna

+0

Siehe http://stackoverflow.com/questions/4680649/zooming-mkmapview-to-fit-annota-pins für einige Objective-C-Beispiele. – Anna

Antwort

4

MKMapRectUnion berechnet und gibt einen neuen rect, nichts weiter. Sie müssen die mapView sagen, seine sichtbaren Bereich auf die neue rect zu setzen:

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

Danke, das ist es –

+1

Es zeigt einen vertikalen Streifen ohne Anmerkungen? –

0

-[MKMapView showAnnotations:animated:]

+0

Schreib ich das nach meinem Code? ist das objektive c-code? –

+0

Ja, das ist eine Methodensignatur. Im Grunde machen Sie ein 'NSArray', das Ihre Punkte enthält, übergeben Sie es als erstes Argument und übergeben Sie ein' BOOL' für das zweite Argument. – incanus

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

Beste Antwort! Die anderen sind übermäßig kompliziert und scheinen in bestimmten Situationen nicht zu funktionieren. – Alan

0

Als @lveselovsky

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

funktioniert perfekt.

Wenn Sie Ihre UI aktualisieren, bevor die Karte geladen ist, können Sie es in der Delegatmethode setzen wie so:

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

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

Booleschen Wert nur um sicher zu machen, wenn es das erste Mal aktualisiert wird, ist es nicht aktualisiert werden, wenn der Benutzer irgendwo anders auf der Karte navigiert :)

0

Swift 3 Fit alle Anmerkungen in der Karte. Es ist der richtige Weg.

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

Für schnelle 3, iOS 10

aktuellen Standort Erhalten Sie zuerst, und mit Rückruf didUpdateLocations die Karte zu konfigurieren. Fügen Sie den folgenden Code in Ihrer View-Controller:

@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

Verwendung unter 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) 
     } 
    } 
} 
Verwandte Themen