/ / Umieszczanie niebieskiej kropki (lokalizacja użytkownika) Tylko przy użyciu CLLocationManager - iphone, location, mkmapview, cllocationmanager

Umieszczanie niebieskiej kropki (lokalizacja użytkownika) Tylko przy użyciu CLLocationManager - iphone, location, mkmapview, cllocationmanager

Przeczytałem niezliczone posty tutaj na stosie i dokumenty Apple i nie mogę znaleźć niczego, aby rozwiązać ten problem.

Problem polega na tym, że jeśli ustawisz mapView.showsUserLocation = YES, wówczas MapKit rozpocznie wysyłanie do telefonu własnych zapytań GPS.

Z dokumentacji Apple:

Ustawienie tej właściwości na TAK powoduje widok mapykorzystać z Lokalizacji głównej ramy dla znalezienia obecnego Lokalizacja. Tak długo jak ta właściwość jest TAK, widok mapy nadal śledzi lokalizacja użytkownika i zaktualizuj go cyklicznie.

Jeśli chcesz również użyć CLLocationManager, wtedy gdy wykonasz połączenie z [mylocationmanager startUpdatingLocation], robisz drugie zapytanie GPS w telefonie.

Teraz masz 2 oddzielne procesy z pytaniem o lokalizację GPS.

Nie ma problemu z symulatorem, ale jeśli go wypróbujeszna prawdziwym telefonie zajmie bardzo dużo czasu, aby uzyskać lokalizację GPS. Jest to również niespójne 10 sekund - 1 minuta, podczas gdy wyłączenie mapView.showsUserLocation bardzo konsekwentnie trwa 2-3 sekundy.

Ogólnie wydaje się, że używanie obu metod jest bardzo złe.

Dla elastyczności i kontroli wolałbym raczej używać CLLocationManager, ale jeśli nie ustawisz mapView.showsUserLocation = YES, to nie dostaniesz niebieskiej kropki!

Próbowałem zwykłych metod nadpisywania adnotacji: np .:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
if ([annotation isKindOfClass:MKUserLocation.class]) {
//it"s the built-in user location annotation, return nil to get default blue dot...
return nil;
}

//handle your custom annotations...
}

Ale to nie działa, najprawdopodobniej dlatego, że nigdy nie ma połączenia z faktycznym umieszczaniem adnotacji użytkownika na mapie.

Więc czy ktoś ma rozwiązanie, aby używać tylko CLLocationManager do umieszczenia lokalizacji użytkownika na mapie?

Odpowiedzi:

0 dla odpowiedzi № 1

Wystarczy przesłonić metodę viewForAnnotation, nie wystarczy, musisz najpierw dodać adnotacje do mapy przez wywołanie

[mapView addAnnotation:annotationObject];

Twój obiekt adnotationObject może być instancją dowolnej klasy implementującej protokół MKAnnotation. Szczegóły znajdziesz w Przewodniku po MapKit w dziale Adnotacje aplikacji.


0 dla odpowiedzi nr 2

Jeśli chcesz pokazać tylko niebieską kropkę wokół swojej lokalizacji (dokładność), możesz to zrobić tak:

MKCircle *accuracyCircle;

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
// when you want update your position and accuracy
[self.mapView removeOverlay:accuracyCircle];
accuracyCircle = [MKCircle circleWithCenterCoordinate:newLocation.coordinate
radius:newLocation.horizontalAccuracy];
[self.mapView addOverlay:accuracyCircle];
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
if([overlay isKindOfClass:[MKCircle class]])
{
MKCircleRenderer * circleRenderer = [[MKCircleRenderer alloc] initWithOverlay:overlay];
circleRenderer.fillColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.2];
return circleRenderer;
}
return nil;
}