2013-03-19 4 views
9

मैं आईओएस के लिए Google मानचित्र एसडीके का उपयोग करता हूं। मेरे पास मेरे मानचित्र पर मार्कर हैं और उचित ज़ूम सेट करना चाहते हैं ताकि मार्कर अलग हो और मार्कर स्क्रीन पर एक बार स्क्रीन पर दिखाई दे सकें। मैं इसे करने में सक्षम हूं। मैंने तर्क का उपयोग करके किया है कि यदि सभी मार्कर दिखाई दे रहे हैं तो ज़ूम इन करें। लेकिन समस्या यह है कि नक्शा कैमरा तेजी से बदल रहा है। मैंने इस ज़ूम को एनिमेट करने के लिए बहुत कुछ करने की कोशिश की लेकिन मैं ऐसा करने में असफल रहा। मैंने एनिमेट करने के लिए एनिमेट करने के लिए एनिमेट करने के लिए एनीमेट टोज़मूम और यूआईवीव एनीमेशन विधि की कोशिश की।एनीमेशन के बिना मानचित्र कैमरा स्थिति तेजी से बदलती है

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

मैं भी MapView कैमरा स्थापित करने और अगर हालत की जबकि पाश में कैमरा एनिमेट के आदेश को पलटने की कोशिश की। मैंने बस इसे करने में 3 दिन बिताए। अब आपकी मदद मांग रहे हैं। अग्रिम धन्यवाद।

उत्तर

12

मुझे लगता है कि इसके साथ समस्या यह है कि setCamera को कॉल किए बिना नए ज़ूम स्तर पर स्नैप किया जाएगा - और इसलिए निम्न कॉल animateToCameraPosition वास्तव में कुछ भी एनिमेट नहीं करेगा, क्योंकि कैमरा पहले से ही उस स्थिति में है।

हालांकि, अगर आपने setCamera पर कॉल हटा दिया है तो आप शायद अनंत लूप में समाप्त हो जाएंगे, क्योंकि animateToCameraPosition पर कॉल वास्तव में कुछ समय बाद (एनीमेशन नाटकों के रूप में) कैमरे को अपडेट नहीं करेगा, और इसलिए लूप के अगले पुनरावृत्ति पर मार्कर अभी भी सभी दिखाई देंगे।

आपको जो करना है उसे अंतिम ज़ूम स्तर की गणना करना है, और उसके बाद कैमरे को स्थानांतरित करने के लिए animateToCameraPosition पर एकल कॉल करें।

How to setRegion with google maps sdk for iOS?

तो तुम एक कैमरे की स्थिति जो करने के लिए अपने मार्कर फिट गणना करने के लिए कुछ इसी तरह इस्तेमाल कर सकते हैं:

मैं केंद्र और एक कैमरे के लिए ज़ूम स्तर की गणना के यहाँ एक सीमा फिट करने के लिए के लिए कुछ कोड तैनात स्क्रीन।

+0

सूत्र के लिए धन्यवाद। यही मुझे चाहिए। – Geek

9

बहुत सरल जवाब: मेरे लिए

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

काम करता है:

इसके बजाय

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

ऐसा करें!

2

यह कोड चयनित मार्कर में मैपव्यू के कैमरे की चिकनी/एनिमेटेड रिपोजिशनिंग करता है।

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

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

शायद आप अपने उत्तर के बारे में अधिक जानकारी दे सकते हैं और समझा सकते हैं कि आपका कोड क्या करना चाहता है। – rducom

+0

टिप्पणी जोड़ा गया है – timurbeg

3
GMSCameraPosition *newCameraPosition = [GMSCameraPosition cameraWithTarget:cordinate zoom:position.zoom]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.mapView animateToCameraPosition:newCameraPosition]; 
}); 
संबंधित मुद्दे