2012-09-24 8 views
23

Ten kod ustawia domyślny poziom powiększenia skupiony wokół określonej lokalizacji w viewDidLoad. Kod działa poprawnie w poprzednich wersjach systemu iOS:MapView w iOS6 nie pokazuje pewnych poziomów powiększenia na szerokości geograficznej> 75 północy

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

Jednak w iOS6 lokalizacje z szerokości powyżej ~ 75 (> 75,1) awarii aplikacji z następującym komunikatem:

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

znalazłem dla danego poziomu powiększenia mapView nie można wewnętrznie ustawić odpowiedniego MKCoordinateRegion. [mapView regionThatFits:region] zwraca wszystkie wartości jako nan. Jeśli użyję bezpośrednio zmiennej region, po prostu wyświetli się domyślna mapa (cały świat).

Po kilku testach okazało się, że poprzez dostosowanie visibleDistance mogę uzyskać kod do prawidłowego działania. Magiczna odległość wydaje się nieznacznie przekraczać 20 kilometrów (gdzieś pomiędzy 22 a 23 km dla szeregu szerokości i szerokości geograficznej). Dzieje się tak tylko na północnych szerokościach geograficznych (-80 działa dobrze).

Mapy działają w dowolnym miejscu po początkowym ustawieniu. Wygląda na to, że Apple zmienił sposób inicjalizacji widocznych regionów mapy. Używam wyższego poziomu powiększenia dla dotkniętego regionu jako obejścia. Czy jest jakiś inny sposób, aby działał poprawnie?

+3

Staraj się nie używać funkcji regionThatFits do generowania MKCoordinateRegion. W systemie iOS 6 zauważam, że nie działa zgodnie z oczekiwaniami (myślę, że to błąd). Zamiast tego utwórz MKCoordinateSpan, aby utworzyć MKCoordinateRegion. Następnie skonfiguruj region widoku mapy do tego. Wreszcie użyj setCenterCoordinate, aby ustawić położenie środkowe widoku mapy. –

+0

Ale muszę znać "MKCoordinateRegion", który pojawi się na ekranie, aby skonfigurować dodatkowe parametry kontrolujące częściowe ładowanie lokalizacji. Ponadto, jeśli użyję 'MKCoordinateSpan', pokażę zmienne domyślne poziomy powiększenia w zależności od szerokości geograficznej (chyba, że ​​skompensuję ją ręcznie). 'MKCoordinateRegionMakeWithDistance()' działa tak jak powinien, ale problem leży w metodzie, która inicjuje 'mapView' z regionem, ponieważ problem jest widoczny, gdy używam' setRegion: 'bezpośrednio (bez' regionThatFits: ') (mapa pokazuje cały świat). – Neur0mans3r

+3

Miałem ten problem. Kiedy przeglądałem mapę map, jej ramka wynosiła 0,0,0,0. Nie jestem pewien, czy to był problem. Usunąłem wywołanie 'regionThatFits' w moim kodzie i zamiast tego wysłałem region zbudowany za pomocą' MKCoordinateRegionMake (location, span) 'i wydaje mi się, że działa on teraz dla mnie. –

Odpowiedz

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

będzie działać ..

+0

Zrobiłem to z moją aplikacją, która jest wyśrodkowana na lat15 i długo-88 i początkowo miała 4000 metrów spamu dla każdego. Po zmianie na sugerowany 100k nadal się zawiesza. Rozbija się o 10,100, 1000, aż do 1 miliarda! :( – marciokoko

+1

Korzystanie z animacji: NIE jest ważne Z animacją: TAK kod wydaje się działać losowo/nie działa, ale z NIE działa niezawodnie –

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

spróbować ....

4

miałem awarii z moich iPhone4S i konsoli ujawnił nan wartości dla regionu. Po wypróbowaniu około 7 różnych rozwiązań z SO i różnych sugestii od Apple DTS, rozwiązałem go, eliminując wywołanie funkcji regionThatFits. Po prostu użyłem:

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

[_mapView setRegion:adjustedRegion animated:YES]; 

Najwyraźniej jest problem z tą metodą regionToFits.

+0

To zadziałało dla mnie.Dziękuję – banditKing

+2

Działa to, ale usuwa niektóre funkcje, które są uzyskiwane przy użyciu regionTo Fits utracone przez jego usunięcie. Twoja współrzędna, na której chciałeś się skoncentrować, może być na przykład poza ekranem. – avance

1

Znalazłem wersję tego kodu na chińskiej stronie internetowej i wydaje się, że działa dla mnie. On tylko pomija rozmiarThatFits, gdy NAN jest zwracany, a więc tylko w razie potrzeby dostosowujący, a jeśli błąd zostanie naprawiony przez Apple (zakładając, że jest to błąd), to nie będzie to wcale problemem.

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]; 
Powiązane problemy