2015-05-19 41 views
12

因此,我想基於緯度和經度值將Google地圖可滾動區域限制爲地圖上的某個矩形。爲了做到這一點,我已經寫了下面的代碼:在iOS版Google地圖SDK上平滑滾動

-(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來存儲您的最小/最大值,並執行更低/更大的檢查。 我會爲委託使用一個標誌不執行兩次。沿着這些線路

東西:

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