2013-04-25 12 views
100

Sto sperimentando l'ultima versione di Google Maps per iOS SDK versione 1.2.1.2944 per animare uno GMSGroundOverlay. L'utente ha il controllo sulla sequenza di immagini, quindi l'utilizzo di un'animata UIImage non è purtroppo una possibilità, quindi sto caricando al volo nello UIImage. Il GMSGroundOverlay.icon è impostato su UIImage che viene aggiornato.Animazione GMSGroundOverlay - dovrei usare un CATiledLayer?

A parte l'utilizzo di memoria alta, mi sembra di aver colpito una limitazione in quanto ogni volta che provo a sovrapporre un UIImage utilizzando GMSGroundOverlay.icon che è più di 1000px x 1000px, si blocca. Il riferimento a UIImage di 1000px x 1000px aggira l'arresto anomalo.

Mi colpisce però che forse avrei dovuto utilizzare CATiledLayer per la gestione dell'immagine da caricare solo nella memoria e, successivamente, nella proprietà icona della GMSGroundOverlay, ma qualcuno ha avuto alcuna esperienza di utilizzo CATiledLayer con Google Maps per iOS SDK e le immagini di sequenziamento come un animato GMSGroundOverlay?

+0

Sto riscontrando lo stesso problema, anche se la soglia che vedo per gli arresti anomali è ancora più bassa. Mi piacerebbe vedere una soluzione per questo. –

+0

Vorrei una soluzione per tutti i tipi di GMSOverlays –

+0

Non vedo come si desidera utilizzare TiledLayer..la sovrapposizione utilizza una UIImmagine ... –

risposta

1

Ho ricevuto questa risposta da pressanswer.com, penso che possa essere d'aiuto.

Come al momento non posso usare il keypath "position" per l'animazione, ho finito per animarlo usando i keypath "latitude" e "longitude" separatamente.

Prima calcolare i punti e aggiungerli a 2 array separati, uno per il valore di latitudine (y) e uno per la longitudine (x) e quindi utilizzare la proprietà values ​​in CAKeyFrameAnimation per animare. Crea 2 oggetti CAKeyFrameAnimation (1 per ciascun asse) e raggruppali insieme usando CAAnimationGroup e animali insieme per formare una cerchia.

Nella mia equazione ho variato la lunghezza del raggio su ciascun asse in modo che possa anche generare un percorso ovale.

NSMutableArray *latitudes = [NSMutableArray arrayWithCapacity:21]; 
    NSMutableArray *longitudes = [NSMutableArray arrayWithCapacity:21]; 
    for (int i = 0; i <= 20; i++) { 
     CGFloat radians = (float)i * ((2.0f * M_PI)/20.0f); 

     // Calculate the x,y coordinate using the angle 
     CGFloat x = hDist * cosf(radians); 
     CGFloat y = vDist * sinf(radians); 

     // Calculate the real lat and lon using the 
     // current lat and lon as center points. 
     y = marker.position.latitude + y; 
     x = marker.position.longitude + x; 


     [longitudes addObject:[NSNumber numberWithFloat:x]]; 
     [latitudes addObject:[NSNumber numberWithFloat:y]]; 
    } 

    CAKeyframeAnimation *horizontalAnimation = [CAKeyframeAnimation animationWithKeyPath:@"longitude"]; 
    horizontalAnimation.values = longitudes; 
    horizontalAnimation.duration = duration; 

    CAKeyframeAnimation *verticleAnimation = [CAKeyframeAnimation animationWithKeyPath:@"latitude"]; 
    verticleAnimation.values = latitudes; 
    verticleAnimation.duration = duration; 

    CAAnimationGroup *group = [[CAAnimationGroup alloc] init]; 
    group.animations = @[horizontalAnimation, verticleAnimation]; 
    group.duration = duration; 
    group.repeatCount = HUGE_VALF; 
    [marker.layer addAnimation:group forKey:[NSString stringWithFormat:@"circular-%@",marker.description]]; 
+0

Questo non è il GMSGroundOverlay. Stai mostrando un GMSMarker. L'overlay non fornisce lo stesso accesso al 'livello' –