MapView en iOS6 no mostrará ciertos niveles de zoom en la latitud> 75 norte

Este código establece un nivel de zoom pnetworkingeterminado centrado alnetworkingedor de una location específica en viewDidLoad . El código funciona bien en versiones anteriores de iOS:

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

Sin embargo, en iOS6 para ubicaciones con una latitud superior a ~ 75 (> 75.1), la aplicación se bloquea con el siguiente post:

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

Descubrí que para el nivel de zoom dado, mapView no puede establecer una MKCoordinateRegion adecuada internamente. [mapView regionThatFits:region] devuelve todos los valores como nan . Si uso la variable de region directamente, solo muestra el map pnetworkingeterminado (el mundo integer).

Después de algunas testings encontré que al ajustar la visibleDistance puedo lograr que el código funcione correctamente. La distancia mágica parece estar ligeramente por encima de los 20 kilómetros (en algún lugar entre 22 y 23 km para una serie de valores de latitud y latitud de Delta). Esto sucede solo en las latitudes del norte (-80 funciona bien).

Los maps funcionan en cualquier location después del posicionamiento inicial. Parece que Apple cambió la forma en que se inicializan las regiones visibles del map. Estoy usando un nivel de zoom más alto para la región afectada como una solución. ¿Hay alguna otra forma de hacer que funcione correctamente?

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

Funcionará..

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

testing esto….

Estaba teniendo problemas con mi iPhone4S y la console reveló valores nanométricos para la región. Después de probar 7 soluciones diferentes de SO y varias sugerencias de Apple DTS, lo solucioné eliminando la llamada regionThatFits. Simplemente usé:

 CLLocationDistance visibleDistance = 100000; // 100 kilometers MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance); [_mapView setRegion:adjustedRegion animated:YES]; 

Al parecer, hay un problema con ese método regionThatFits.

Encontré una versión de este código en un website chino y parece funcionar para mí. Él solo pasa por alto el tamaño que se activa cuando se devuelve la NAN, por lo tanto, solo se ajusta si es necesario, y si Apple corrige este error (suponiendo que sea un error), entonces no será 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];