Tak, możliwe jest posiadanie oddzielnego obiektu zarządzania lokalizacjami i przypisanie jego wartości do widoku mapy (BTW, używam "=" poniżej jako prefiksu listy, aby zapobiec borkowaniu formaterów kodu SO).
= W swojej UIViewController
zachowaj dwie oddzielne właściwości: jedną na MKMapView
i jedną na CLLocationManager
.
= Utwórz plik XIB za pomocą MKMapView
i dowolnego innego żądanego okna. Połącz gniazda z propetami kontrolera. Upewnij się, że MKMapView
NIE podąża za lokalizacją użytkownika.
= Niech kontroler UIViewController implementuje protokół CLLocationManagerDelegate
- szczególnie metodę locationManager:didUpdateToLocation:fromLocation:
, która będzie wywoływana za każdym razem, gdy dostępna będzie nowa wartość lokalizacji. Ustawimy kontroler jako delegata dla menedżera lokalizacji.
= W metodzie viewController's loadView
załaduj NIB z MKMapView
w nim. Aby przekazać opinię użytkownika, możesz ustawić pokrętło UIActivityIndicatorView
i ustawić je na startAnimating
. Następnie zacząć:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];
= W locationManager:didUpdateToLocation:fromLocation:
sprawdzić, czy zdarzenie zostało zaktualizowane od ostatnich N sekund.Następnie powiedz menadżerowi lokalizacji, aby przestał aktualizować, spinner przestał animować i uzyskał dane długie/długie i przypisać je do widoku mapy wraz z zasięgiem widoku i regionem, aby powiększyć i wyśrodkować w odpowiednie miejsce.
= Teraz jest trudna część: niebieski marmurowy "throbber" jest cechą lokalizacji użytkownika śledzenia mapview. Będziesz musiał na chwilę "sfingować", dopóki prawdziwy kopniak (lub po prostu użyć oddzielnego znacznika dla bieżącej lokalizacji i zachować swoją pozycję samemu). Osobiście pójdę z niebieskim marmurem, który zna użytkownik.
= Aby było tak, aby był wyświetlany zaraz po uruchomieniu, musisz utworzyć niestandardowy widok MKAnnotationView z niebieską marmurową grafiką dodaną w lokalizacji zwróconej przez menedżera lokalizacji. Oznacza to zrobienie migawki mapy z widoczną lokalizacją, a następnie zdjęcie tylko niebieskiego marmuru i użycie go jako obrazu dla niestandardowego widoku adnotacji.
= Jeśli chcesz aktywnie podążać za mapą, możesz włączyć śledzenie lokalizacji użytkownika w widoku mapy, a gdy pobierze on rzeczywiste dane, ukryjesz uprzednio ustawiony znacznik i zezwolisz widokowi mapy na aktualizację. Drugą opcją jest umożliwienie istniejącemu menedżerowi lokalizacji ciągłego otrzymywania aktualizacji co sekundę i aktualizowanie pozycji niebieskiej adnotacji z marmuru.
= pozwolić MapView własnej userLocation zrobić aktualizację dodać do viewDidLoad:
[self.map.userLocation addObserver:self
forKeyPath:@"location"
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location
= Wdrożenie observeValueForKeyPath
. To jest wywoływana gdy atrybut MapView na userlocation
location
ma wartość:
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([self.map isUserLocationVisible]) {
[self.locationManager stopUpdatingLocation];
self.ownBlueMarble.hidden = YES;
}
// The current location is in self.map.userLocation.coordinate
}
= Aby uniknąć nagrzewania opóźnienie pokazujący aktualną lokalizację, zachować odniesienie do viewController zawierający mapę i kierownik lokalizacji, tak to nie odejdzie (to jest trochę pamięci, ale jeśli ją zwolnisz, będziesz musiał poczekać, aż MapView załaduje płytki i będzie gotowy do pracy).
= W viewWillLoad
możesz umieścić ostatnie znane miejsce w niestandardowej adnotacji bluemarble i pokazać to. Włącz/wyłącz śledzenie lokalizacji użytkownika, a gdy otrzymasz powiadomienie, będzie działać ta sama sztuczka z ukrytymi komentarzami. Zostaje uruchomiony menedżer lokalizacji, który przegląda mapę, a kiedy ma dane, możesz zlikwidować znacznik adnotacji.
= Możesz zaimplementować metodę viewController's viewWillDisappear
i ręcznie wyłączyć śledzenie userLocation
w widoku mapy, aby domyślnie wyłączyć się przy następnym wyświetleniu widoku. Będziesz także chciał uzyskać ostatni znany userLocation
i zapisać go do następnego uruchomienia. W ten sposób możesz wykonać wszystkie żonglerki znaczników pozycjonowania w metodzie viewWillAppear
i nie musisz się martwić o ingerencję UserLocation, dopóki nie będziesz na to gotowy.
Powodzenia.
Dzięki Ramin. Nie jest to oczekiwane rozwiązanie, ale myślę, że jest najbliższy istniejący. – jantimon
Tak, byłoby o wiele łatwiej, gdyby pozwoliły nam ustawić userLocation na widok mapy na wartość początkową ... lub jeszcze lepiej zezwolić na użycie istniejącej instancji klasy CLLocationManager zamiast tworzyć własne ... ale niestety nie t. – Ramin