2014-04-21 12 views
16

Używam przycisku MKUserTrackingBarButtonItem, aby umożliwić użytkownikowi automatyczne śledzenie ich lokalizacji na mapie. Problem polega na tym, że po dotknięciu tego przycisku jest on powiększany zbyt daleko. Chcę zacząć od określonego poziomu powiększenia (tj. Zakresu). Jak mogę to osiągnąć?Jak określić poziom powiększenia podczas korzystania z MKUserTrackingBarButtonItem?

Gdy użytkownik dotknie przycisku, aby zmienić na MKUserTrackingModeFollow, wydaje się, że używa tego samego poziomu powiększenia, który użytkownik ostatnio ręcznie zmienił (tj. Za pomocą gestów na mapie). Próba określenia innego poziomu powiększenia za pomocą setRegion lub setVisibleMapRect nie wpływa na to, jaki poziom powiększenia będzie używany po zmianie trybu na MKUserTrackingModeFollow.

Próba ustawienia override mapView:didChangeUserTrackingMode: w celu ustawienia regionu powoduje zmianę trybu z powrotem na MKUserTrackingModeNone. Przykład:

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { 
    if (mode == MKUserTrackingModeFollow) { 
     CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; 
     MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); 
     [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; 
     // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO]; 
    } 
} 

Gdybym próbują przywrócić tryb natychmiast po ustawieniu regionu, to działa dobrze, gdy użytkownik jest nieruchoma, ale powiększa się z powrotem, gdy użytkownik jest w ruchu.

Najprostszym rozwiązaniem byłby sposób, aby po prostu podać coś w rodzaju poziomu powiększenia MKUserTraking, wysyłając mu moją wartość zakresu. Jednak skoro to nie wydaje się istnieć, co jeszcze mogę zrobić?

+0

znalazłeś rozwiązanie to? Obecnie walczę z tym samym problemem. –

Odpowiedz

7

Miałem ten sam problem i zastosowałem inne podejście, aby to naprawić. Możesz użyć funkcji MapCamera zamiast tego przycisku.

Na każdym nowym miejscu to zrobić:

MKMapCamera *newCamera = [MKMapCamera cameraLookingAtCenterCoordinate:[newLocation coordinate] 
fromEyeCoordinate:[oldLocation coordinate] 
eyeAltitude:2000]; 

[mapView setCamera:newCamera animated:TRUE]; 

I grać z eyeAltitude.

Jeśli użytkownik ręcznie powiększy lub zmniejszy odległość, można odczytać wartość wysokości z mapview.camera.altitude również nie aktualizować kamery, gdy użytkownik ręcznie korzysta z mapy.

+0

wygląda na to, że to jedyny sposób! – Rassam

0

Według dokumentacji jabłoni stosowane tutaj

https://developer.apple.com/reference/mapkit/mkmapview/1616208-usertrackingmode

Ustawienie trybu śledzenia śledzić lub śledzić Z działu powoduje widoku mapy, aby wyśrodkować mapę na tym miejscu i rozpocząć śledzenie użytkownika Lokalizacja. Jeśli mapa jest pomniejszona, widok mapy automatycznie przybliża lokalizację użytkownika, skutecznie zmieniając bieżący widoczny region.

Tutaj zmiana regionu nie ma wpływu na widoczny region z tego powodu.

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { 
if (mode == MKUserTrackingModeFollow) { 
    CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; 
    MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); 
    [mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; 
    // [mapView setUserTrackingMode:MKUserTrackingModeFollow animated:NO]; 
} 
} 

więc wystarczy zmienić centrum koordynowania na didChangeUserTrackingMode zamiast zmieniać cały region

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated { 
if (mode == MKUserTrackingModeFollow) { 
    [self.mapView setCenterCoordinate:mapView.userLocation.location.coordinate animated:YES]; 
    } 
} 

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { 
    [self.mapView setCenterCoordinate:mapViewuserLocation.location.coordinate animated:YES]; 
} 

na kliknięcie MKUserTrackingBarButtonItem zmienić poziom powiększenia

CLLocationCoordinate2D center = mapView.userLocation.location.coordinate; 
MKCoordinateSpan span = MKCoordinateSpanMake(0.002306, 0.001717); 
[mapView setRegion:MKCoordinateRegionMake(center, span) animated:YES]; 
Powiązane problemy