Animazione GMSGroundOverlay: dovrei usare un CATiledLayer?


99

Sto sperimentando l'ultima versione 1.2.1.2944 dell'SDK di Google Maps per iOS per animare un file GMSGroundOverlay. L'utente ha il controllo sulla sequenza di immagini, quindi l'utilizzo di un'animazione UIImagenon è purtroppo una possibilità, quindi sto caricando UIImageal volo. Il GMSGroundOverlay.iconè impostato il UIImageche viene aggiornata.

A parte l'elevato utilizzo della memoria, mi sembra di aver riscontrato una limitazione in quanto ogni volta che provo a sovrapporre un UIImageutilizzo GMSGroundOverlay.iconche è più di 1000px x 1000px, si blocca. UIImageFare riferimento a un 1000px x 1000px aggira il crash.

Tuttavia, mi colpisce che forse dovrei utilizzare CATiledLayerper gestire l'immagine da caricare solo in memoria e successivamente nella proprietà icon di GMSGroundOverlay, ma qualcuno ha avuto esperienza di utilizzo CATiledLayercon Google Maps per iOS SDK e sequenze di immagini come animate GMSGroundOverlay?


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

Vorrei una soluzione per tutti i tipi di GMSOverlays
Daij-Djan

Non vedo come vuoi usare TiledLayer..la sovrapposizione usa un UIImage ...
Daij-Djan

Risposte:


1

Ho ricevuto questa risposta da pressinganswer.com, penso che possa aiutarti.

Poiché attualmente non posso utilizzare il percorso chiave "position" per l'animazione, ho finito per animarlo utilizzando separatamente i percorsi chiave "latitude" e "longitude".

Prima calcola i punti e aggiungili a 2 array separati, uno per il valore di latitudine (y) e uno per la longitudine (x), quindi utilizza la proprietà dei valori in CAKeyFrameAnimation per l'animazione. Crea 2 oggetti CAKeyFrameAnimation (1 per ogni asse) e raggruppali insieme utilizzando CAAnimationGroup e animali insieme per formare un cerchio.

Nella mia equazione modifico la lunghezza del raggio su ogni asse in modo da poter generare anche 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]];

Questo non è GMSGroundOverlay. Stai mostrando un GMSMarker. L'overlay non fornisce lo stesso accesso al "livello"
Erik Gross
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.