Animación de GMSGroundOverlay: ¿debería usar un CATiledLayer?

99

Estoy experimentando con la última versión 1.2.1.2944 del SDK de Google Maps para iOS para animar un archivo GMSGroundOverlay. El usuario tiene control sobre la secuencia de imágenes, por lo que el uso de una animación UIImageno es una posibilidad, lamentablemente, así que lo estoy cargando UIImagesobre la marcha. Se GMSGroundOverlay.iconestablece en el UIImageque se actualiza.

Aparte del alto uso de memoria, parece que he encontrado una limitación en el sentido de que cada vez que intento superponer un UIImageuso de GMSGroundOverlay.iconmás de 1000px x 1000px, se bloquea. UIImageHacer referencia a un valor de 1000px x 1000px evita el bloqueo.

Sin embargo, me sorprende que tal vez debería utilizar CATiledLayerpara manejar la imagen para cargarla solo en la memoria y luego en la propiedad del icono GMSGroundOverlay, pero ¿alguien ha tenido alguna experiencia en el uso CATiledLayercon Google Maps para iOS SDK y la secuenciación de imágenes como una animación GMSGroundOverlay?

RobWhistler
fuente
Tengo el mismo problema, aunque el umbral que veo para los accidentes es aún más bajo. Me encantaría ver una solución para esto.
eric.mitchell
Me gustaría una solución para todo tipo de GMSOverlays
Daij-Djan
No veo cómo quieres usar TiledLayer ... la superposición usa un UIImage ...
Daij-Djan

Respuestas:

1

Obtuve esta respuesta de pressanswer.com, creo que puede ayudarte.

Como actualmente no puedo usar la ruta clave de "posición" para animar, terminé animándola usando las rutas clave de "latitud" y "longitud" por separado.

Primero calcule los puntos y agréguelos a 2 matrices separadas, una para el valor de latitud (y) y otra para la longitud (x) y luego use la propiedad de valores en CAKeyFrameAnimation para animar. Cree 2 objetos CAKeyFrameAnimation (1 para cada eje) y agrúpelos usando CAAnimationGroup y anímelos para formar un círculo.

En mi ecuación, varío la longitud del radio en cada eje para que también pueda generar una trayectoria ovalada.

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]];
Rashad Valliyengal
fuente
Este no es GMSGroundOverlay. Estás mostrando un GMSMarker. La superposición no proporciona el mismo acceso a la 'capa'
Erik Gross