2012-09-24 49 views
23

Este código establece un nivel de zoom predeterminado centrado en una ubicación específica en viewDidLoad. El código funciona bien en las versiones anteriores de iOS:MapView en iOS6 no mostrará ciertos niveles de zoom en latitud> 75 norte

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

Sin embargo, en iOS 6 para las ubicaciones con la latitud por encima de ~ 75 (> 75,1) la aplicación se bloquea con el siguiente mensaje:

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

He encontrado que para el nivel de zoom dado mapView no se puede establecer correctamente un MKCoordinateRegion internamente. [mapView regionThatFits:region] devuelve todos los valores como nan. Si uso la variable region directamente, solo muestra el mapa predeterminado (todo el mundo).

Después de algunas pruebas, encontré que ajustando el visibleDistance puedo hacer que el código funcione correctamente. La distancia mágica parece estar ligeramente por encima de 20 kilómetros (en algún lugar entre 22 y 23 km para una serie de latitudes y valores de LatitudDelta). Esto ocurre solo en las latitudes del norte (-80 funciona bien).

Los mapas funcionan en cualquier ubicación después del posicionamiento inicial. Parece que Apple cambió la forma en que se inicializaron las regiones de mapas visibles. Estoy utilizando un nivel de zoom más alto para la región afectada como una solución alternativa. ¿Hay alguna otra manera de hacerlo funcionar correctamente?

+3

Trate de no usar regionThatFits para generar una MKCoordinateRegion. En iOS 6, noto que no funciona como esperaba (creo que esto es un error). En su lugar, cree MKCoordinateSpan para crear una MKCoordinateRegion. Luego configura la región de la vista del mapa a eso. Finalmente use setCenterCoordinate para configurar la posición central de la vista del mapa. –

+0

Pero necesito saber la 'MKCoordinateRegion' que se mostrará en la pantalla para configurar parámetros adicionales que controlen la carga parcial de ubicaciones. Además, si utilizo un 'MKCoordinateSpan' mostraría los niveles de zoom variables variables en función de la latitud (a menos que lo compense manualmente). 'MKCoordinateRegionMakeWithDistance()' funciona como debería, pero el problema está en el método que inicializa 'mapView' con la región, porque el problema es evidente cuando uso' setRegion: 'directamente (sin' regionThatFits: ') (el mapa muestra El mundo entero). – Neur0mans3r

+3

Estaba teniendo este problema. Cuando busqué mi mapView, su fotograma fue 0,0,0,0. No estoy seguro si este fue el problema. Eliminé la llamada 'regionThatFits' en mi código y, en su lugar, envié una región construida con' MKCoordinateRegionMake (location, span) 'y parece funcionar ahora para mí. –

Respuesta

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

Se trabajará ..

+0

Lo hice con mi aplicación que está centrada en lat15 y long-88 y originalmente tenía 4000 metros de spam para cada uno. Después de cambiar a su sugerencia de 100k, aún se bloquea. ¡Se bloquea a 10,100, 1000 hasta 1 billón! :( – marciokoko

+1

Usando animated: NO es importante. Con animación: SÍ el código parece funcionar aleatoriamente/no funciona, pero con NO funciona de manera confiable. –

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

probar esto ....

4

que estaba teniendo accidentes con mis iPhone4S y la consola reveló valores NaN para la región. Después de probar aproximadamente 7 soluciones diferentes de SO y varias sugerencias de Apple DTS, lo resolví eliminando la llamada regionThatFits. Simplemente utilicé:

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

[_mapView setRegion:adjustedRegion animated:YES]; 

Aparentemente hay un problema con ese método regionThatFits.

+0

Esto funcionó para mí. Gracias – banditKing

+2

Esto funciona pero elimina alguna funcionalidad que se gana al usar regionThatFits que se pierde al eliminarla. Es posible que la coordenada que esperaba centrar fuera fuera de la pantalla, por ejemplo. – avance

1

Encontré una versión de este código en un sitio web chino y parece funcionar para mí. Solo está omitiendo sizeThatFits cuando se devuelve el NAN, por lo tanto solo se ajusta si es necesario, y si Apple soluciona este error (asumiendo que es un error) entonces no será un problema en absoluto.

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