2014-04-21 5 views
16

Ich verwende eine MKUserTrackingBarButtonItem Schaltfläche, damit der Benutzer seinen Standort auf einer Karte automatisch verfolgen kann. Das Problem ist, dass wenn sie auf diese Schaltfläche tippen, sie zu weit herausgezoomt ist. Ich möchte, dass es bei einer bestimmten Zoomstufe (d. H. Spanne) beginnt. Wie kann ich das erreichen?Wie lege ich die Zoomstufe fest, wenn ein MKUserTrackingBarButtonItem verwendet wird?

Wenn der Benutzer auf die Schaltfläche tippt, um zu MKUserTrackingModeFollow zu wechseln, scheint dieselbe Zoomstufe zu verwenden, zu der der Benutzer zuletzt manuell gewechselt hat (z. B. mithilfe von Gesten auf der Karte). Der Versuch, eine andere Zoomstufe über setRegion oder setVisibleMapRect anzugeben, hat keinen Einfluss darauf, welche Zoomstufe verwendet wird, wenn der Modus auf MKUserTrackingModeFollow geändert wird.

Wenn versucht wird, die Region auf override mapView:didChangeUserTrackingMode: festzulegen, wird der Modus auf MKUserTrackingModeNone zurückgesetzt. Beispiel:

- (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]; 
    } 
} 

Wenn ich den Modus unmittelbar nach der Region Einstellung zurückgesetzt werden versuchen, es funktioniert gut, wenn der Benutzer stationär ist, sondern zoomt wieder aus, wenn der Benutzer bewegt.

Die einfachste Lösung wäre, wenn es eine Möglichkeit gäbe, einfach etwas wie eine Zoomstufe für MKUserTrinking zu spezifizieren, indem man mir meinen Spannenwert sendet. Da dies jedoch nicht zu existieren scheint, was kann ich noch tun?

+0

Haben Sie eine Lösung gefunden Dies? Ich haue mir gerade den Kopf gegen das selbe Problem. –

Antwort

7

Ich hatte das gleiche Problem und verwendet einen anderen Ansatz, um es zu beheben. Sie können dafür die MapCamera-Funktion anstelle dieser Schaltfläche verwenden.

An jedem neuen Ort dies zu tun:

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

[mapView setCamera:newCamera animated:TRUE]; 

Und mit dem eyeAltitude spielen.

Wenn der Benutzer manuell vergrößert oder verkleinert wird, können Sie den Höhenwert von mapview.camera.altitude ablesen und auch die Kamera nicht aktualisieren, wenn der Benutzer die Karte manuell verwendet.

+0

sieht so aus als ob das der einzige Weg ist! – Rassam

0

Dokumentation Laut Apple verwendet hier

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

Einstellen des Tracking-Modus Mit Heading bewirkt, dass die Kartenansicht zu zentrieren die Karte auf dieser Position und beginnen Tracking des Benutzers zu folgen oder folgen Lage. Wenn die Karte herausgezoomt ist, vergrößert die Kartenansicht automatisch den Standort des Benutzers, wodurch der aktuelle sichtbare Bereich effektiv geändert wird.

Hier wirkt sich das Ändern der Region aus diesem Grund nicht auf Ihre sichtbare Region aus.

- (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]; 
} 
} 

So müssen Sie nur Zentrum auf didChangeUserTrackingMode Koordinate ändern, anstatt die gesamte Region ändern

- (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]; 
} 

auf Klick auf MKUserTrackingBarButtonItem das Niveau Zoom ändern

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