2012-07-11 16 views
12

Czy możemy mieć niestandardowy widok adnotacji dla bieżącej lokalizacji użytkowników w systemie iOS?Niestandardowy widok adnotacji dla lokalizacji użytkownika nie przesuwającej widoku mapy

Potrzebuję usunąć niebieską kropkę (z okręgami) z moim własnym niestandardowym widokiem (powiedz ping ping). Czy można to zrobić?

Jeśli to zrobimy, czy ten pinezka przenosi się do nowej lokalizacji, gdy następuje zmiana lokalizacji użytkownika? Czy potrzebujemy go programowo obsłużyć?

Zauważyłem, że jeśli użyjemy domyślnej niebieskiej kropki dla bieżącej lokalizacji użytkownika, to zostanie ona zaktualizowana na mapie, gdy nastąpi zmiana w lokalizacji użytkownika.

Po prostu chcę wiedzieć, czy można to zrobić za pomocą naszego własnego widoku niestandardowego.

Odpowiedz

14

Tak, możesz mieć niestandardowy widok dla lokalizacji użytkownika.

Niestety, jest to trudniejsze do wykonania niż powinno być, bo choć documentation for the viewForAnnotation delegate method twierdzi, że można po prostu podać swój własny pogląd, jeśli klasa adnotacja jest MKUserLocation, widok niestandardowy nie wtedy nadal poruszać z lokalizacji użytkownika. W rzeczywistości, po zwróceniu niestandardowego widoku dla MKUserLocation, widok mapy przestaje całkowicie aktualizować lokalizację użytkownika (metoda delegowania mapy widoku mapy nie jest już uruchamiana). Wierzę, że to błąd.

Rozwiązaniem jest użycie CLLocationManager i niestandardowego adnotacji ...


Upewnij showsUserLocation jest NO lub zaznaczone na widoku mapy.

stwierdzenie właściwości dla CLLocationManager i niestandardowego adnotacji przy użyciu niestandardowej klasy, która implementuje protokół MKAnnotation (lub może po prostu użyć rodzajowego MKPointAnnotation klasę).

W viewDidLoad lub inne odpowiednie miejsce, stworzyć CLLocationManager, ustawić jego delegate i nazywają startUpdatingLocation.

W location manager's didUpdateToLocation delegate method (nie metoda didUpdateUserLocation delegat widoku mapy'S), utworzyć lub zaktualizować niestandardowe adnotacji:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    if (myUserLocAnnot == nil) 
    { 
     self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease]; 
      //remove the autorelease if using ARC 
     myUserLocAnnot.title = @"You are here"; 
     myUserLocAnnot.coordinate = newLocation.coordinate; 
     [mapView addAnnotation:myUserLocAnnot]; 
    } 
    else 
    { 
     myUserLocAnnot.coordinate = newLocation.coordinate; 
    } 
} 

Wreszcie w viewForAnnotation metody delegata widoku mapy, w ty wróci niestandardowego widoku adnotacji jeśli adnotacja jest adnotacją lokalizacji użytkownika niestandardowego.

+0

w obliczu tego samego problemu, może możemy podnieść błąd na jabłko – darshansonde

+0

Dzięki Anna, działa już teraz. Nawet podejrzewam, że istnieje błąd w widoku mapy, który nie pokazuje naszego niestandardowego widoku adnotacji dla lokalizacji użytkownika po jej ustawieniu. – nkd

+0

Jeszcze jeden problem, który mam tutaj do czynienia, to, jak tylko uruchomię aktualizację lokalizacji, otrzymam wywołanie z powrotem do usługi locationManager: didUpdateToLocation: fromLocation, w której utworzę adnotację i dodaję ją do mapy, ale mapa nie pokazuje mojego niestandardowego widoku nawet chociaż zwracam niestandardowy widok. Jeśli wyłączę lokalizację i lokalizację, zadziała. Czy jest tu jakiś problem? – nkd