Подтвердить что ты не робот

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 изменила способ отображения видимых областей карты. Я использую более высокий уровень масштабирования для затронутого региона как обходной путь. Есть ли другой способ заставить его работать правильно?

4b9b3361

Ответ 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];