2012-09-24 14 views
23

Questo codice imposta un livello di zoom predefinito centrato attorno a una posizione specificata in viewDidLoad. Il codice funziona bene nelle versioni precedenti di iOS:MapView in iOS6 non mostrerà determinati livelli di zoom alla latitudine> 75 nord

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

Tuttavia, in iOS6 per le posizioni con la latitudine sopra ~ 75 (> 75,1) l'applicazione si blocca con il seguente messaggio:

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

ho trovato che per il livello di zoom specificato mapView non è possibile impostare un valore corretto per MKCoordinateRegion internamente. [mapView regionThatFits:region] restituisce tutti i valori come nan. Se utilizzo direttamente la variabile region, mostra solo la mappa predefinita (il mondo intero).

Dopo alcuni test ho trovato che regolando il visibleDistance posso far funzionare correttamente il codice. La distanza magica sembra essere leggermente superiore ai 20 chilometri (da qualche parte tra 22 e 23 km per una serie di valori di latitudine e latitudineDelta). Questo succede solo alle latitudini settentrionali (-80 funziona bene).

Le mappe funzionano in qualsiasi posizione dopo il posizionamento iniziale. Sembra che Apple abbia cambiato il modo in cui le regioni della mappa visibile vengono inizializzate. Sto usando un livello di zoom più alto per la regione interessata come soluzione alternativa. C'è un altro modo per farlo funzionare correttamente?

+3

Provare a non utilizzare regionThatFits per generare una MKCoordinateRegion. In iOS 6, noto che non funziona come previsto (penso che questo sia un bug). Invece, crea MKCoordinateSpan per creare una MKCoordinateRegion. Quindi imposta la regione della vista della mappa su quella. Infine usa setCenterCoordinate per impostare la posizione centrale della vista della mappa. –

+0

Ma ho bisogno di conoscere il 'MKCoordinateRegion' che verrà mostrato sullo schermo per impostare parametri aggiuntivi che controllano il caricamento parziale delle posizioni. Inoltre, se uso un 'MKCoordinateSpan' mostrerei livelli di zoom variabili predefiniti a seconda della latitudine (a meno che non compensi manualmente). 'MKCoordinateRegionMakeWithDistance()' funziona come dovrebbe, ma il problema è nel metodo che inizializza 'mapView' con la regione, perché il problema è evidente quando uso' setRegion: 'direttamente (senza' regionThatFits: ') (la mappa mostra il mondo intero). – Neur0mans3r

+3

Stavo avendo questo problema. Quando ho inserito il mio mapView, il suo frame era 0,0,0,0. Non sono sicuro se questo era il problema. Ho rimosso la chiamata 'regionThatFits' nel mio codice e invece ho inviato una regione compilata con' MKCoordinateRegionMake (location, span) 'e sembra che funzioni per ora. –

risposta

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

Funzionerà ..

+0

L'ho fatto con la mia app che è centrata su lat15 e long-88 e in origine aveva uno spam di 4000 metri ciascuno. Dopo essere passato al 100k suggerito, si blocca ancora. Arresta a 10.100, 1000 fino a 1 miliardo! :( – marciokoko

+1

Usando animato: NO è importante Con l'animazione: SI il codice sembra funzionare in modo casuale/non funziona, ma con NO funziona in modo affidabile –

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

provare questo ....

4

ho avuto crash con i miei iPhone4S e console hanno rivelato valori nan per regione. Dopo aver provato circa 7 diverse soluzioni da SO e vari suggerimenti da Apple DTS, l'ho risolto eliminando la chiamata regionThatFits. Ho semplicemente usato:

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

[_mapView setRegion:adjustedRegion animated:YES]; 

Apparentemente c'è un problema con quel metodo di zonaThat.

+0

Questo ha funzionato per me Grazie – banditKing

+2

Questo funziona ma rimuove alcune funzionalità che si ottiene utilizzando regionThatFits che viene perso rimuovendolo. Ad esempio, le coordinate che avresti sperato di centrare potrebbero essere fuori campo. – avance

1

Ho trovato una versione di questo codice su un sito Web cinese e sembra funzionare per me. Ignora sizeThatFits solo quando viene restituito il NAN, quindi aggiusta solo se necessario, e se questo bug viene corretto da Apple (supponendo che si tratti di un bug), non sarà affatto un problema.

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]; 
Problemi correlati