MapView в iOS6 не покажет определенные уровни масштабирования на широте> 75 север
Этот код устанавливает уровень масштабирования по умолчанию, сосредоточенный вокруг определенного места в viewDidLoad
.
Код работает отлично в предыдущих версиях iOS:
CLLocationDistance visibleDistance = 100000; // 100 kilometers
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, visibleDistance, visibleDistance);
MKCoordinateRegion adjustedRegion = [mapView regionThatFits:region];
.
.
.
[mapView setRegion:adjustedRegion animated:NO];
Однако в iOS6 для местоположений с широтой выше ~ 75 ( > 75.1) приложение вылетает со следующим сообщением:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'Invalid Region <center:nan, nan span:nan, nan>'
Я обнаружил, что для данного уровня масштабирования mapView
не может установить правильный MKCoordinateRegion
внутри. [mapView regionThatFits:region]
возвращает все значения как nan
. Если я использую переменную region
напрямую, она просто отображает карту по умолчанию (весь мир).
После некоторого тестирования я обнаружил, что, отрегулировав visibleDistance
, я могу заставить код работать правильно. Магическое расстояние, по-видимому, немного выше 20 километров (где-то между 22 и 23 км для ряда широт и широты значений Дельты).
Это происходит только на северных широтах (-80 работает просто отлично).
Карты работают в любом месте после первоначального позиционирования. Похоже, Apple изменила способ отображения видимых областей карты. Я использую более высокий уровень масштабирования для затронутого региона как обходной путь. Есть ли другой способ заставить его работать правильно?
Ответы
Ответ 1
CLLocationDistance visibleDistance = 100000; // 100 kilometers
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, visibleDistance, visibleDistance);
MKCoordinateRegion adjustedRegion = [mapView regionThatFits:region];
.
.
.
[mapView setRegion:adjustedRegion animated:NO];
Это сработает.
Ответ 2
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];
попробуйте это....
Ответ 3
У меня были сбои с моим iPhone4S, а консоль обнаружила значения nan для региона. Попробовав около 7 различных решений от SO и различных предложений от Apple DTS, я решил это, исключив вызов regionThatFits. Я просто использовал:
CLLocationDistance visibleDistance = 100000; // 100 kilometers
MKCoordinateRegion adjustedRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, visibleDistance, visibleDistance);
[_mapView setRegion:adjustedRegion animated:YES];
По-видимому, существует проблема с этим методом RegionThatFits.
Ответ 4
Я нашел версию этого кода на китайском веб-сайте и, похоже, работает для меня. Он только обходит sizeThatFits, когда возвращается NAN, поэтому при необходимости корректируется, и если эта ошибка будет исправлена Apple (предположим, что это ошибка), это не будет проблемой вообще.
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];