2013-03-19 16 views
9

iOS için google Maps SDK kullanıyor. Haritalarımda işaretleyiciler var ve işaretçilerin ayrı olması için işaretlerin düzgün bir şekilde ayarlanmasını istiyorum ve aynı zamanda işaretçilerin ekranda aynı anda görünmesi gerekiyor. Bunu yapabiliyorum. Tüm işaretleyiciler görünürse, yakınlaştırma mantığını kullanarak yaptım. Ancak sorun harita kameranın keskin bir şekilde değişmesidir. Bu yakınlaştırmayı canlandırmak için çok denedim ama yapamadım. AnimateToCameraPosition, animateToZoom ve UIView animasyon yöntemini denedim. Harita kamerası konumu, animasyon olmadan hızlı bir şekilde değişiyor

- (BOOL)allCoordinatesVisibleWithLatitudes:(NSArray *)arrayOfLatitudes Longitudes:(NSArray *)arrayOfLongitudes 
    { 
    CLLocationCoordinate2D coordinate; 
    for(int i=0;i<arrayOfLatitudes.count;i++) 
    { 
     coordinate = CLLocationCoordinate2DMake([[arrayOfLatitudes objectAtIndex:i] floatValue], [[arrayOfLongitudes objectAtIndex:i] floatValue]); 
     if(![self.mapView.projection containsCoordinate:coordinate]) 
     { 
      return NO; 
     } 
    } 
    return YES; 
} 


- (void)setZoomToHaveProperView 
{ 
    NSMutableArray * arrayOfLatitudes = [[NSMutableArray alloc] init]; 
    NSMutableArray * arrayOfLongitudes = [[NSMutableArray alloc] init]; 
    RS_SingleMatch * singleMatch = [[RS_SingleMatch alloc] init]; 
    float zoom = 0.0; 

    // You may ignore this first for loop. it just takes coordinate of all markers in  arrays. 

    for(int i=0;i<=self.userMatches.arrayOfMatches.count;i++) 
    { 
     if(i==self.userMatches.arrayOfMatches.count) 
     { 
      RS_Trip * userTrip = [[RS_Trip alloc] init]; 
      [arrayOfLatitudes addObject:[NSNumber numberWithFloat:userTrip.fromLat]]; 
      [arrayOfLongitudes addObject:[NSNumber numberWithFloat:userTrip.fromLon]]; 
      if(self.segmentedControl.selectedSegmentIndex == 1) 
      { 
       [arrayOfLatitudes addObject:[NSNumber numberWithFloat:userTrip.toLat]]; 
       [arrayOfLongitudes addObject:[NSNumber numberWithFloat:userTrip.toLon]]; 
      } 
     } 
     else 
     { 
      singleMatch = [self.userMatches.arrayOfMatches objectAtIndex:i]; 
      [arrayOfLatitudes addObject:[NSNumber numberWithFloat:singleMatch.fromLat]]; 
      [arrayOfLongitudes addObject:[NSNumber numberWithFloat:singleMatch.fromLong]]; 
      if(self.segmentedControl.selectedSegmentIndex == 1) 
      { 
       [arrayOfLatitudes addObject:[NSNumber numberWithFloat:singleMatch.toLat]]; 
       [arrayOfLongitudes addObject:[NSNumber numberWithFloat:singleMatch.toLong]]; 
      } 
     } 
} 
    zoom = self.mapView.camera.zoom; 

    // if all coordinates are visible then zoom in 
    if([self allCoordinatesVisibleWithLatitudes:arrayOfLatitudes Longitudes:arrayOfLongitudes]) 
    { 
     while ([self allCoordinatesVisibleWithLatitudes:arrayOfLatitudes Longitudes:arrayOfLongitudes]) 
     { 
      zoom += 0.5; 
      [self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]]; 
      [self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]]; 
     } 
    } 
} 

Ben de mapview kamera ayarı ve eğer durumun ise döngü içinde kamerayı animasyon sırası ters çalıştı. Sadece 3 günümü harcadım. Şimdi yardımını istiyorsun. Önceden teşekkür ederiz.

cevap

12

Buradaki sorun, setCamera numaralı telefonun çağrılmasının animasyon yapmadan yeni yakınlaştırma seviyesine ulaşmasıdır - ve bu nedenle animateToCameraPosition numaralı telefona yapılan arama, kamera zaten bu konumda olduğu için hiçbir şeyi canlandırmayacaktır.

Ancak, setCamera numaralı aramayı kaldırdıysanız, animateToCameraPosition numaralı çağrı gerçekte kamerayı bir süredir (animasyonda olduğu gibi) kamerayı güncelleyemediğinden, büyük olasılıkla sonsuz bir döngü içinde olursunuz. Döngünün sonraki yinelemesinde, işaretleyicilerin hepsi yine de görünürdü.

Yapmanız gereken şey, ihtiyacınız olan son yakınlaştırma seviyesini hesaplamak ve kamerayı oraya taşımak için animateToCameraPosition numarasına tek bir çağrı yapmaktır.

How to setRegion with google maps sdk for iOS?

Yani için işaretçilerinizi uyabilecek bir kamera konumunu hesaplamak için benzer bir şey kullanabilirsiniz:

Burada bir sınır uygun bir kamera için merkezi ve yakınlaştırma düzeyini hesaplamak için bazı kodlar yayınlanmıştır ekran.

+0

teşekkürler. İhtiyacım olan bu. – Geek

9

Çok daha basit cevap:

yerine

[self.mapView setCamera:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]]; 
[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:self.mapView.camera.targetAsCoordinate zoom:zoom]]; 

bu yapın:

[self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithTarget:[GMSCameraPosition cameraWithTarget:self.mapView.camera.target zoom:zoom]]]; 

Works benim için!

2

Bu kod, harita görüntüsünün kamerasının seçilen işaretçiye düzgün/hareketli bir şekilde yeniden konumlandırılmasını sağlar. formülü için

- (BOOL)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker { 

    [mapView animateWithCameraUpdate:[GMSCameraUpdate setTarget:marker.position]]; 
    mapView.selectedMarker = marker; 
    return YES; 
} 
+0

Belki de cevabınız hakkında daha fazla bilgi verebilir ve kodunuzun ne yapmak istediğini açıklayabilirsiniz. – rducom

+0

Yorum eklendi – timurbeg

3
GMSCameraPosition *newCameraPosition = [GMSCameraPosition cameraWithTarget:cordinate zoom:position.zoom]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.mapView animateToCameraPosition:newCameraPosition]; 
}); 
İlgili konular