2012-09-24 7 views
23

Dieser Code legt eine Standardzoomstufe um eine angegebene Position in viewDidLoad fest. Der Code funktioniert in früheren Versionen von iOS fein:MapView in iOS6 zeigt bestimmte Zoomstufen bei Breiten> 75 Nord nicht an

CLLocationDistance visibleDistance = 100000; // 100 kilometers 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, visibleDistance, visibleDistance); 
MKCoordinateRegion adjustedRegion = [mapView regionThatFits:region]; 
. 
. 
. 
[mapView setRegion:adjustedRegion animated:NO]; 

jedoch in iOS6 für Standorte mit Breite über ~ 75 (> 75,1) die App stürzt ab mit der folgenden Meldung:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Invalid Region <center:nan, nan span:nan, nan>' 

gefunden dass für die angegebene Zoomstufe mapView intern kein richtiges MKCoordinateRegion gesetzt werden kann. [mapView regionThatFits:region] gibt alle Werte als nan zurück. Wenn ich die Variable region direkt verwende, wird nur die Standardkarte (die ganze Welt) angezeigt.

Nach ein paar Tests habe ich festgestellt, dass durch die Anpassung der visibleDistance kann ich den Code richtig funktionieren. Die magische Distanz scheint etwas über 20 Kilometer zu liegen (irgendwo zwischen 22 und 23 km für eine Reihe von Breiten- und BreitengradenDelta-Werten). Dies geschieht nur in nördlichen Breiten (-80 funktioniert gut).

Die Karten funktionieren an jedem Ort nach der anfänglichen Positionierung. Es sieht so aus, als ob Apple die Art der Initialisierung von Kartenregionen geändert hat. Ich verwende eine höhere Zoomstufe für die betroffene Region als Workaround. Gibt es einen anderen Weg, um es richtig funktionieren zu lassen?

+3

Versuchen Sie nicht, regionThatFits zu verwenden, um eine MKCoordinateRegion zu generieren. In iOS 6 stelle ich fest, dass es nicht wie erwartet funktioniert (ich denke, das ist ein Fehler). Erstellen Sie stattdessen MKCoordinateSpan, um eine MKCoordinateRegion zu erstellen. Richten Sie dann die Region der Kartenansicht darauf ein. Verwenden Sie abschließend setCenterCoordinate, um die Mittelposition der Kartenansicht einzurichten. –

+0

Aber ich muss die "MKCoordinateRegion" kennen, die auf dem Bildschirm angezeigt wird, um zusätzliche Parameter einzurichten, die das partielle Laden von Orten steuern. Wenn ich einen 'MKCoordinateSpan' benutze, würde ich variable Standardniveaus des Zooms zeigen, abhängig von der Breite (es sei denn, ich kompensiere manuell). 'MKCoordinateRegionMakeWithDistance()' funktioniert wie es sollte, aber das Problem liegt in der Methode, die 'mapView' mit der Region initialisiert, weil das Problem offensichtlich ist, wenn ich' setRegion: 'direkt benutze (ohne' regionThatFits: ') (die Map zeigt die ganze Welt). – Neur0mans3r

+3

Ich hatte dieses Problem. Als ich meine mapView postete, war der Frame 0,0,0,0. Nicht sicher, ob das das Problem war. Ich habe den 'regionThatFits'-Aufruf in meinem Code entfernt und stattdessen eine Region gesendet, die mit 'MKCoordinateRegionMake (location, span)' erstellt wurde, und es scheint jetzt für mich zu funktionieren. –

Antwort

5
CLLocationDistance visibleDistance = 100000; // 100 kilometers 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, visibleDistance, visibleDistance); 
MKCoordinateRegion adjustedRegion = [mapView regionThatFits:region]; 
. 
. 
. 
[mapView setRegion:adjustedRegion animated:NO]; 

Es funktioniert ..

+0

Ich tat dies mit meiner App, die auf Lat15 und Long-88 zentriert ist und ursprünglich 4000 Meter Spam für jeden hatte. Nach dem Wechsel zu Ihrer vorgeschlagenen 100k stürzt es immer noch ab. Es stürzt bei 10.100 ab, 1000 bis zu einer Milliarde! :( – marciokoko

+1

Verwenden animiert: NEIN ist wichtig. Mit Animation: Ja scheint der Code nach dem Zufallsprinzip arbeiten/nicht funktionieren, aber mit NO funktioniert es zuverlässig. –

5
CLLocationCoordinate2D southwest, northeast; 
southwest.latitude = 34.172684; 
southwest.longitude = -118.604794; 
northeast.latitude = 34.236144; 
northeast.longitude = -118.500938; 
BSForwardGeocoderCoordinateBounds *bounds = [BSForwardGeocoderCoordinateBounds boundsWithSouthWest:southwest northEast:northeast]; 

try this ....

4

Ich war Abstürze mit meiner iPhone4S und Konsole mit ergab nan für Region Werte. Nachdem ich 7 verschiedene Lösungen von SO und verschiedene Vorschläge von Apple DTS getestet hatte, löste ich es, indem ich den Aufruf regionThatFits eliminierte. Ich verwendete einfach:

CLLocationDistance visibleDistance = 100000; // 100 kilometers 
MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance); 

[_mapView setRegion:adjustedRegion animated:YES]; 

Anscheinend gibt es ein Problem mit dieser regionThatFits Methode.

+0

Dies hat für mich funktioniert. Danke – banditKing

+2

Dies funktioniert, aber entfernt einige Funktionen, die durch Verwendung gewonnen wird regionThatFits, die verloren gehen, wenn Sie es entfernen Ihre Koordinate, auf die Sie gehofft haben, könnte sich beispielsweise außerhalb des Bildschirms befinden. – avance

1

Ich habe eine Version dieses Codes auf einer chinesischen Website gefunden und es scheint für mich zu funktionieren. Er umgeht nur sizeThatFits, wenn die NAN zurückgegeben wird, passt also nur wenn nötig an, und wenn dieser Fehler von Apple behoben wird (vorausgesetzt, es handelt sich um einen Fehler), ist das überhaupt kein Problem.

MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(coordinate, mapSizeMeters, mapSizeMeters); 

MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion]; 

if (isnan(adjustedRegion.center.latitude)) { 
    // iOS 6 will result in nan. 2012-10-15 
    adjustedRegion.center.latitude = viewRegion.center.latitude; 
    adjustedRegion.center.longitude = viewRegion.center.longitude; 
    adjustedRegion.span.latitudeDelta = 0; 
    adjustedRegion.span.longitudeDelta = 0; 
} 


[mapView setRegion:adjustedRegion animated:YES];