2015-05-19 4 views
12

Поэтому я хочу ограничить область прокрутки Google Maps определенным прямоугольником на карте, основанным на значениях широты и долготы. Для того, чтобы сделать это я написал следующий код:Плавная прокрутка в Google Maps SDK для 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)]]; 
    } 
} 

И это хорошо работает, он останавливается карту на те моменты, которые я хочу, чтобы остановиться, но одна вещь, которую я заметил, что на края допустимых границ, прокрутка очень скачкообразная, а не гладкая. Мне было интересно, есть ли способ убедиться, что карта осталась в пределах указанных границ, а также сохраняя плавную прокрутку по краям.

Любая помощь будет принята с благодарностью, спасибо!

ответ

1

Попробуйте вместо этого:

-(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

Соответственно с API docs

-[GMSMapView moveCamera:] 

переставляет камеру в соответствии с инструкциями, определенными в обновлении. Перемещение происходит мгновенно, а последующее getCameraPosition() будет отражать новую позицию. См. CameraUpdateFactory для набора обновлений.

Так что, если вы хотите анимацию нужно использовать

-[GMSMapView animateCamera:] 

Имейте в виду, что ваш делегат будет вызываться несколько раз во время анимации.

0

Неточность плавания может быть частью вашей проблемы, в результате чего ваши делегаты будут вызываться несколько раз. Я бы использовал NSNumber для хранения вашего min/max и выполнения более низких/больших проверок. Я бы использовал флаг, чтобы делегат не выполнял дважды.

Что-то вдоль этих линий:

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; 
} 
Смежные вопросы