2013-03-19 17 views
9

Io uso google Maps SDK per iOS. Ho marcatori sulla mia mappa e voglio impostare lo zoom corretto in modo che i marcatori siano separati e anche i marcatori dovrebbero essere visibili sullo schermo tutto in una volta. Sono in grado di farlo. Ho fatto usando la logica che se tutti i marcatori sono visibili, allora ingrandisci. Ma il problema è che la fotocamera della mappa sta cambiando bruscamente. Ho provato molto ad animare questo zoom ma non ci sono riuscito. Ho provato il metodo di animazione animateToCameraPosition, animateToZoom e UIView.La posizione della telecamera della mappa cambia bruscamente senza animazione

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

Ho anche provato l'ordine di inversione di impostare la telecamera mapview e l'animazione della telecamera mentre il ciclo di condizione. Ho passato 3 giorni a farlo. Ora chiedi il tuo aiuto. Grazie in anticipo.

risposta

12

Penso che il problema con questo è che chiamando setCamera si agganci al nuovo livello di zoom senza animare - e quindi la seguente chiamata a animateToCameraPosition non animerà effettivamente nulla, poiché la fotocamera è già in quella posizione.

Tuttavia, se si rimuovesse la chiamata a setCamera, probabilmente si finirebbe in un ciclo infinito, poiché la chiamata a animateToCameraPosition non aggiornerà la telecamera fino a qualche istante dopo (come l'animazione riproduce), e così via alla successiva iterazione del ciclo i marcatori sarebbero comunque tutti visibili.

Quello che devi fare è calcolare il livello di zoom finale di cui hai bisogno, quindi effettuare una singola chiamata a animateToCameraPosition per spostare la telecamera lì.

ho postato qualche codice per calcolare il centro e livello di zoom di una macchina fotografica per adattarsi a un limite qui:

How to setRegion with google maps sdk for iOS?

Così si potrebbe usare qualcosa di simile a calcolare una posizione della telecamera che misura i vostri marcatori per lo schermo.

+0

Grazie per la formula. Questo è quello di cui avevo bisogno. – Geek

9

risposta molto più semplice:

Invece di

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

Fate questo:

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

funziona per me!

2

Questo codice esegue il riposizionamento fluido/animato della telecamera di mapview sull'indicatore selezionato.

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

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

Forse puoi fornire maggiori dettagli sulla tua risposta e spiegare cosa intendi fare il tuo codice. – rducom

+0

Il commento è stato aggiunto – timurbeg

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