Korzystam z MKMapView i dodałem do mapy szereg pinezek z adnotacjami o obszarze 5-10 kilometrów. Kiedy uruchamiam aplikację, moja mapa zaczyna być pomniejszona, aby pokazać cały świat, jaki jest najlepszy sposób na powiększenie mapy, aby szpilki pasowały do widoku?
EDYCJA: Moje początkowe myślenie byłoby użyć MKCoordinateRegionMake i obliczyć współrzędne współrzędnych, długość geograficzną i szerokość geograficzną z moich adnotacji. Jestem pewien, że to zadziała, ale chciałem tylko sprawdzić, czy nie umknęło mi nic oczywistego.
Dodano kod, BTW: FGLocation jest klasą zgodną MKAnnotation
, lokalizacjaFake jest jednym NSMutableArray
z tych obiektów. Komentarze są zawsze mile widziane ....
- (MKCoordinateRegion)regionFromLocations {
CLLocationCoordinate2D upper = [[locationFake objectAtIndex:0] coordinate];
CLLocationCoordinate2D lower = [[locationFake objectAtIndex:0] coordinate];
// FIND LIMITS
for(FGLocation *eachLocation in locationFake) {
if([eachLocation coordinate].latitude > upper.latitude) upper.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].latitude < lower.latitude) lower.latitude = [eachLocation coordinate].latitude;
if([eachLocation coordinate].longitude > upper.longitude) upper.longitude = [eachLocation coordinate].longitude;
if([eachLocation coordinate].longitude < lower.longitude) lower.longitude = [eachLocation coordinate].longitude;
}
// FIND REGION
MKCoordinateSpan locationSpan;
locationSpan.latitudeDelta = upper.latitude - lower.latitude;
locationSpan.longitudeDelta = upper.longitude - lower.longitude;
CLLocationCoordinate2D locationCenter;
locationCenter.latitude = (upper.latitude + lower.latitude) / 2;
locationCenter.longitude = (upper.longitude + lower.longitude) / 2;
MKCoordinateRegion region = MKCoordinateRegionMake(locationCenter, locationSpan);
return region;
}
ios
objective-c
iphone
cocoa-touch
mkmapview
fuzzygoat
źródło
źródło
Odpowiedzi:
Masz rację.
Znajdź swoje maksymalne i minimalne szerokości i długości geograficzne, zastosuj prostą arytmetykę i użyj
MKCoordinateRegionMake
.Dla iOS 7 i powyżej, zastosowania
showAnnotations:animated:
, odMKMapView.h
:źródło
// Position the map such that the provided array of annotations are all visible to the fullest extent possible.
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated NS_AVAILABLE(10_9, 7_0);
showAnnotations
dodaje także adnotacje do mapy, nawet jeśli adnotacja dla tej lokalizacji już istnieje.removeAnnotations(_ annotations:)
natychmiast poshowAnnotations(_ annotations:animated)
To tutaj znalazłem , który działał dla mnie:
(EDYCJA: Zaktualizowałem rozwiązanie, używając sugestii @ Micah, aby zwiększyć pointRect o 0,1, aby upewnić się, że odbyt nie będzie nieskończenie mały!)
Możesz również zaktualizować to, aby zawierało pin użytkownika UserLocation, zastępując pierwszy wiersz:
źródło
Apple dodał nową metodę dla IOS 7, aby nieco uprościć życie.
Możesz łatwo pobrać z tablicy zapisanej w widoku mapy:
i szybko dostosuj też aparat!
to nie zadziała, chyba że użytkownik ma zainstalowany system iOS 7+ lub OS X 10.9+. sprawdź tutaj niestandardową animację
źródło
showAnnotations
dzieje się tak z powodu innych czynników w mojej implementacji, ale uważam, że nie robi to tak blisko powiększenia / dopasowania adnotacji, jak w przypadku implementacji ręcznej, więc utknąłem z instrukcją ręczną.Używam tego kodu i działa dobrze dla mnie:
źródło
W szybkim użyciu
W Celu c
źródło
mapView.showAnnotations(mapView.annotations, animated: true)
Przekształciłem odpowiedź Rafaela Moreiry. Kredyt należy do niego. Dla tych, którzy szukają wersji Swift, oto kod:
źródło
Swift 3 To jest poprawny sposób na dopasowanie wszystkich adnotacji na mapie.
źródło
Rozwiązanie @ jowie działa świetnie. Jeden haczyk, jeśli mapa ma tylko jedną adnotację, otrzymasz w pełni pomniejszoną mapę. Dodałem 0,1 do rozmiaru prostokąta, aby upewnić się, że setVisibleMapRect ma coś do powiększenia.
źródło
Jeśli szukasz systemu iOS 8 lub nowszego , najprostszym sposobem jest ustawienie
var layoutMargins: UIEdgeInsets { get set }
widoku mapy przed zadzwonieniemfunc showAnnotations(annotations: [MKAnnotation], animated: Bool)
Na przykład (Swift 2.1):
źródło
Utworzyłem rozszerzenie, aby szybko wyświetlać wszystkie adnotacje za pomocą kodu od czasu do czasu. Nie będą wyświetlane wszystkie adnotacje, jeśli nie będą mogły zostać wyświetlone nawet przy maksymalnym powiększeniu.
źródło
UIEdgeInsetsMake
parametry, wartości od 30 do 100 były dla mnie dobre. Testowałem przy użyciu iPhone'a SE i) S 10.2 Simulator. Przykład Kod:setVisibleMapRect(zoomRect, edgePadding: UIEdgeInsetsMake(100, 100, 100, 100), animated: true)
. Uwaga: ten kod działa w Swift 3 i XCode 8.2.1.Dodano tę pętlę If w pętli for, aby wykluczyć pin lokalizacji użytkownika z tej metody (wymagane w moim przypadku i być może inne)
źródło
W systemie iOS 7 i nowszym (Refering MKMapView.h):
uwaga od - Abhishek Bedi
Po prostu dzwonisz:
źródło
W Swift
źródło
// Edytowano dla szybkiego 5
źródło
Dzięki jowie zaktualizowałem moją starą kategorię do bardziej eleganckiego rozwiązania. Udostępnianie kompletne, prawie gotowe do skopiowania i wklejenia rozwiązanie
MKMapView + AnnotationsRegion.h
MKMapView + AnnotationsRegion.m
Mam nadzieję, że to komuś pomoże i jeszcze raz dziękuję jowie!
źródło
źródło
Jak zauważa Abhishek Bedi w komentarzu, najlepszym sposobem na iOS7 jest:
W moim osobistym projekcie (wcześniejszym niż iOS7) po prostu dodałem kategorię do klasy MKMapView, aby zawrzeć funkcję „widocznego obszaru” dla bardzo częstej operacji: ustawianie, aby była w stanie zobaczyć wszystkie aktualnie załadowane adnotacje w instancji MKMapView ( obejmuje to tyle pinów, ile mogłeś umieścić, a także lokalizację użytkownika). wynik był następujący:
plik .h
plik .m
Jak widać, do tej pory dodałem 2 metody: jedną do ustawiania widocznego regionu mapy na tę, która pasuje do wszystkich aktualnie załadowanych adnotacji w instancji MKMapView, oraz drugą metodę ustawiania jej na dowolną tablicę obiektów. Aby ustawić widoczny region mapView, kod byłby wtedy tak prosty jak:
Mam nadzieję, że to pomoże =)
źródło
Wszystkie odpowiedzi na tej stronie zakładają, że mapa zajmuje pełny ekran . Właściwie mam wyświetlacz HUD (tj. Przyciski rozrzucone u góry i na dole), które podają informacje na górze mapy .. i dlatego algorytmy na stronie będą wyświetlały pinezki w porządku, ale niektóre z nich pojawią się pod przyciskami wyświetlacza HUD .
Moje rozwiązanie powiększa mapę, aby wyświetlać adnotacje w podzestawie ekranu i działa dla różnych rozmiarów ekranu (tj. 3,5 "vs 4,0" itp.):
Oto, co zrobiłem w kodzie (uwaga: używam
NSConstraints
z niektórymi metodami pomocniczymi, aby mój kod działał w różnych rozmiarach ekranu .. podczas gdy kod jest dość czytelny .. moja odpowiedź tutaj wyjaśnia to lepiej .. to w zasadzie ten sam przepływ pracy :)oto kod, który pobiera region, który pasuje:
źródło
Dokonałem niewielkiej modyfikacji kodu Rafaela dla kategorii MKMapView.
źródło
W oparciu o powyższe odpowiedzi można użyć uniwersalnej metody powiększania mapy w celu dopasowania wszystkich adnotacji i nakładek jednocześnie.
I wtedy:
źródło
Po prostu dzielę się swoimi spostrzeżeniami na ten temat:
Jeśli używasz xCode> 6 z „wnioskowanymi” rozmiarami ekranów (patrz „symulowane metryki” w inspektorze plików) w serii ujęć, wywoływanie
- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated
w
viewDidLoad
spowoduje zbyt dużego poziomu powiększenia na iPhone z 4 cali ponieważ układ na mapie jest jeszcze od wielkości szerszych ekranach z serii ujęć.Możesz przenieść swoje połączenie
showAnnotations...
doviewDidAppear
. Następnie rozmiar mapy został już dostosowany do mniejszego ekranu iPhone'a 4.Lub alternatywnie zmień wartość „wywnioskowaną” w inspektorze plików w obszarze „Symulowane metryki” na iPhone 4-calowy.
źródło
Możesz wybrać kształty, które chcesz pokazać wraz z adnotacjami.
źródło
@ „Nie jestem pewien, czy dzieje się tak z powodu innych czynników w mojej implementacji, ale uważam, że showAnnotations nie robi tak ścisłego powiększenia / dopasowania adnotacji, jak robi to ręczna implementacja, więc utknąłem manual one. - Ted Avery 17 kwietnia o 0:35 "
Miałem ten sam problem, ale potem dwukrotnie spróbowałem zrobić showAnnotations (jak poniżej) iz jakiegoś powodu zadziałało.
[mapView showAnnotations: yourAnnotationArray animated: YES]; [mapView showAnnotations: yourAnnotationArray animated: YES];
źródło
Sposobem zgodnym z iOS 7 jest użycie następujących. Pierwsze połączenie
showAnnotation
w celu uzyskania prostokąta zawierającego wszystkie adnotacje. Następnie utwórzUIEdgeInset
z górną wstawką wysokości sworznia. W ten sposób zapewniasz pokazanie całej pinezki na mapie.źródło
Wprowadź to odpowiednio do swojego kodu:
źródło