2015-05-19 37 views
12

Bu yüzden, Google Haritalar kaydırılabilir alanını, haritadaki belirli bir dikdörtgenin enlem ve Boylam değerlerine göre sınırlandırmasını istiyorum. Bunu yapmak için ben şu kodu yazdık:iOS için Pürüzsüz Scrolling iOS için SDK 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)]]; 
    } 
} 

Ve bu ancak fark etmiş bir şey üzerinde yani, ben de durdurmak istiyor noktalarda haritayı durur, iyi çalışıyor Kabul edilebilir sınırların kenarları kaydırma yerine pürüzsüz, çok sarsıntılı. Haritanın belirtilen sınırlar içinde kaldığından ve kenarlarda düzgün kaydırma yapıldığından emin olmanın herhangi bir yolu olup olmadığını merak ediyordum.

Herhangi bir yardım çok takdir edilecektir, teşekkür ederim!

cevap

1

yerine bu deneyin:

Buna göre
-(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

-[GMSMapView moveCamera:] 

API docs ile güncelleme tanımlanan talimatlara göre kamerayı yeniden konumlandırır. Hareket anında ve sonraki getCameraPosition() yeni konumu yansıtacaktır. Bir dizi güncelleme için CameraUpdateFactory'ye bakın. Eğer animasyon istiyorsanız

Yani temsilci animasyon sırasında birden çok kez adı verilecek unutmayın

-[GMSMapView animateCamera:] 

kullanmak gerekir.

0

Float uygunsuzluğu, delege temsilcilerinin birden çok kez çağrılmasına neden olarak sorununuzun bir parçası olabilir. Min/max'ınızı depolamak ve daha düşük/büyük kontroller yapmak için NSNumber'i kullanırım. Temsilcinin iki kez yürütülmemesi için bir bayrak kullanırım. Bu doğrultuda

şey:

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