ios - Animación de GMSGroundOverlay: ¿Debería usar un CATiledLayer?
crash google-maps-sdk-ios (1)
Estoy experimentando con la última versión 1.2.1.2944 de Google Maps para iOS SDK para animar un GMSGroundOverlay
. El usuario tiene control sobre la secuencia de la imagen, por lo que utilizar un UIImage
animado no es una posibilidad tristemente, así que estoy cargando el UIImage
sobre la marcha. GMSGroundOverlay.icon
se establece en el UIImage
que se está actualizando.
Aparte del alto uso de memoria, parece que me he topado con una limitación porque cada vez que trato de superponer un UIImage
usando GMSGroundOverlay.icon
que es más de 1000px x 1000px, se cuelga. Al hacer referencia a un UIImage
de 1000px x 1000px, se soluciona el problema.
Sin embargo, me parece que debería utilizar CATiledLayer
para manejar la imagen y cargarla en la memoria y posteriormente en la propiedad icon de GMSGroundOverlay
, pero alguien ha tenido experiencia en utilizar CATiledLayer
con Google Maps para iOS SDK y secuenciar imágenes como GMSGroundOverlay
animado GMSGroundOverlay
?
Recibí esta respuesta de pressinganswer.com, creo que puede ser útil.
Como actualmente no puedo usar la ruta de tecla de "posición" para animar, terminé animando con las vías de acceso 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 values en CAKeyFrameAnimation para animar. Cree 2 objetos CAKeyFrameAnimation (1 para cada eje) y agrúpelos utilizando CAAnimationGroup y anímelos juntos 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 oval.
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]];