2015-05-19 13 views
12

Dlatego chcę ograniczyć zakres przewijania Map Google do określonego prostokąta na mapie w oparciu o wartości szerokości i długości geograficznej. W tym celu napisałem poniższy kod:Płynne przewijanie w Google Maps SDK dla iOS

-(void) viewDidLoad{ 
    startLat = 43.331635f; 
    startLong = -74.472913f; 
    endLat = 43.329106f; 
    endLong = -74.470589f; 
    float cameraPosLat = (startLat + endLat)/2.0f; 
    float cameraPosLong = (startLong + endLong)/2.0f; 

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:cameraPosLat 
                 longitude:cameraPosLong 
                  zoom:18]; 
    mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; 
    mapView.mapType = kGMSTypeSatellite; 
    mapView.delegate = self; 
    mapView.myLocationEnabled = YES; 
    [mapView setMinZoom:18 maxZoom:mapView.maxZoom]; 
    self.view = mapView; 
    marker.map = mapView; 
} 

-(void) mapView:(GMSMapView *)delegateMapView didChangeCameraPosition:(GMSCameraPosition *)position{ 
    if(delegateMapView.camera.target.latitude > startLat){ 
     [delegateMapView moveCamera:[GMSCameraUpdate setTarget:CLLocationCoordinate2DMake(startLat, delegateMapView.camera.target.longitude)]]; 
    } 
    if(delegateMapView.camera.target.latitude < endLat){ 
     [delegateMapView moveCamera:[GMSCameraUpdate setTarget:CLLocationCoordinate2DMake(endLat, delegateMapView.camera.target.longitude)]]; 
    } 
    if(delegateMapView.camera.target.longitude < startLong){ 
     [delegateMapView moveCamera:[GMSCameraUpdate setTarget:CLLocationCoordinate2DMake(delegateMapView.camera.target.latitude, startLong)]]; 
    } 
    if(delegateMapView.camera.target.longitude > endLong){ 
     [delegateMapView moveCamera:[GMSCameraUpdate setTarget:CLLocationCoordinate2DMake(delegateMapView.camera.target.latitude, endLong)]]; 
    } 
} 

I to działa dobrze, to zatrzymuje mapę punktów, które chcę zatrzymać się w, jednak jedna rzecz, którą zauważyłem jest to, że na krawędzie akceptowalnych granic przewijanie jest bardzo niewygodne, a nie płynne. Zastanawiałem się, czy istnieje jakiś sposób, aby upewnić się, że mapa pozostała w określonych granicach, jednocześnie zachowując płynne przewijanie na krawędziach.

Każda pomoc będzie bardzo ceniona, dziękuję!

Odpowiedz

1

Spróbuj to zamiast:

-(void) mapView:(GMSMapView *)delegateMapView didChangeCameraPosition:(GMSCameraPosition *)position{ 
    if(delegateMapView.camera.target.latitude > startLat){ 
     [delegateMapView animateToCameraPosition:[GMSCameraPosition 
      cameraWithLatitude:startLat 
      longitude:delegateMapView.camera.target.longitude 
      zoom:delegateMapView.camera.zoom]]; 
    } 
    if(delegateMapView.camera.target.latitude < endLat){ 
     [delegateMapView animateToCameraPosition:[GMSCameraPosition 
      cameraWithLatitude:endLat 
      longitude:delegateMapView.camera.target.longitude 
      zoom:delegateMapView.camera.zoom]]; 
    } 
    if(delegateMapView.camera.target.longitude < startLong){ 
     [delegateMapView animateToCameraPosition:[GMSCameraPosition 
      cameraWithLatitude:delegateMapView.camera.target.latitude 
      longitude:startLong 
      zoom:delegateMapView.camera.zoom]]; 
    } 
    if(delegateMapView.camera.target.longitude > endLong){ 
     [delegateMapView animateToCameraPosition:[GMSCameraPosition 
      cameraWithLatitude:delegateMapView.camera.target.latitude 
      longitude:endLong 
      zoom:delegateMapView.camera.zoom]]; 
    } 
} 
1

W związku z API docs

-[GMSMapView moveCamera:] 

zmienia położenie aparatu zgodnie z instrukcjami określonymi w aktualizacji. Ruch jest natychmiastowy, a kolejna metoda getCameraPosition() odzwierciedli nową pozycję. Zobacz CameraUpdateFactory w celu uzyskania zestawu aktualizacji.

Więc jeśli chcesz animację trzeba użyć

-[GMSMapView animateCamera:] 

Należy pamiętać, że delegat będzie wywoływana wielokrotnie podczas animacji.

0

Niepewność ruchu może być częścią problemu, powodując wielokrotne wywoływanie delegatów. Używam NSNumber do przechowywania min/max i wykonywania niższych/większych kontroli. Użyłbym flagi, aby delegat nie wykonywał dwukrotnie.

Coś wzdłuż tych linii:

NSNumber *lat = [NSNumber numberWithDouble:delegateMapView.camera.target.latitude]; 
if(lat > self.startLat && !self.hasChangedCameraLat){ 
    [delegateMapView animateToCameraPosition:[GMSCameraPosition 
     cameraWithLatitude:[self.startLat doubleValue] 
     longitude:delegateMapView.camera.target.longitude 
     zoom:delegateMapView.camera.zoom]]; 
    self.hasChangedCameraLat = YES; 
} 
else { 
    self.hasChangedCameraLat = NO; 
} 
Powiązane problemy