2014-04-16 4 views
5

Ich verwende diesen Code, um die Region von MKMapView so zu setzen, dass sie um pin herum zentriert ist und gezoomt ist, um einen ungefähren 10km-Bereich anzuzeigen.MKMapView setRegion: Absturz am Rand der Welt

CLLocationAccuracy accuracy = kCLLocationAccuracyKilometer; 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(pin.coordinate, accuracy * 10.0f, accuracy * 10.0f); 
[self.mapSubView setRegion:region animated:NO]; 

Wenn der Code mit einem Stift des Breitenkoordinate läuft -90, Längengrad -58,359001159667969 die region wird, wie gezeigt erzeugt:

Ein Absturz auftritt, wenn die mapSubView gezogen wird: -

Beenden der App wegen nicht abgefangener Ausnahme 'NSInvalidArgumentException', Grund: ' Ungültige Region < Zentrum: -90,00000000, -58,35900116 Spannweite: 0,08953039, 1462142065660629,00000000 > '

Mein erster Versuch, diese für "Kante" lat/long (-90, +90 zu überprüfen war Festsetzung, -180, +180), wodurch das Problem gelöst wurde. Wenn sich der Breitengrad jedoch auf -89.99999 ändert, wird das Problem zurückgegeben.

ich dies zu raten ist auf eine Kombination aus dem Breitengrad Wesen -90 und/oder die Länge Delta Region Spannweite so groß ist in einer Region führt, die wirksam ist „nicht von dieser Welt“: p

Irgendein Rat, wie man die Karte um einen Stift an irgendeiner Koordinate zentriert, einen ~ 10km Bereich zeigend, ohne diesen Abbruch würde sehr geschätzt werden.

Antwort

0

Ich konnte den Absturz reproduzieren. Ich denke, es ist ein Fehler im SDK.

Und dieser Test auch scheitern, aber mit nicht Absturz:

MKCoordinateRegion region; 
region.center.longitude = coord.longitude; 
region.center.latitude = 90.f;//coord.latitude; 
region.span.longitudeDelta = 0.02f; 
region.span.latitudeDelta = 0.02f; 

[self.mapView setRegion:region animated:NO]; 

, dass eine stabile Version wäre. Nur hier ist die Region dann sehr groß. Sie können die Delta-Werte testen, wenn ein NSNotFound

+0

Überprüfen der Delta-Werte gegen 'NSNotFound' nicht funktioniert, Siehe diese Konsolenausgabe: - 'Longitude span: 1462142065660629.000000 vs NSNotFound: 2147483647' –

+0

Ja, Sie haben Recht. Mein Fehler aber ich denke das ist auch irgendwo ein MAX Wert definiert. Eine sehr schlechte Arbeit eine Runde ist zu testen, ob die Spannweite ein absurder Wert ist. Ich habe in den Apple-Entwicklerforen nach diesem Problem gesucht, aber ich habe nichts gefunden. Sorry, aber jetzt weiß ich nicht mehr. –

3

Zuerst Kartenbereich mit regionThatFits: Methode anpassen. Vergleichen Sie dann die Ergebnisspannen-Deltas mit dem Nan-Wert. Sie sollten etwas davon haben:

region = [self.mapView regionThatFits:region]; 
if (!isnan(region.span.latitudeDelta) && !isnan(region.span.longitudeDelta)) { 
    [self.mapView setRegion:region animated:YES]; 
} 
1

@ supp-f Antwort richtig

Swift 3 Lösung:

func safeSetRegion(_ region: MKCoordinateRegion) { 
    let myRegion = self.mapView.regionThatFits(region) 
    if !(myRegion.span.latitudeDelta.isNaN || myRegion.span.longitudeDelta.isNaN) { 
     self.mapView.setRegion(myRegion, animated: true) 
    } 
}