2011-01-14 22 views
7

Digamos que quiero agregar 50 imágenes a una vista con el propósito de animarlas. Y supongamos que estoy planeando utilizar Core Animation (por ejemplo, CABasicAnimation) en lugar de animación "UIView".iOS: ¿Debo agregar UIViews o CALayers para la animación?

¿Es mejor implementar esto agregando 50 subvistas o 50 subcapas? ¿Hace alguna diferencia?

Gracias.

Respuesta

16

Como describo here, utilicé tanto UIViews como CALayers en animaciones y encontré una diferencia de rendimiento insignificante entre ellos. UIViews son envoltorios muy ligeros alrededor de las capas. Además, cualquier animación basada en capas que necesite se puede aplicar fácilmente a la capa de respaldo de UIView.

He usado CALayers directamente en situaciones en las que quería crear elementos de interfaz de usuario multiplataforma (Mac/iOS), porque los CALayers son casi idénticos en su implementación en ambas plataformas (a diferencia de NSViews y UIViews significativamente diferentes). Los CALayers no tienen rutinas táctiles listas para usar, pero puede agregar esa capacidad si es necesario.

También hay algunos casos de borde donde es posible que desee trabajar directamente con capas, como cuando se intenta hacer una manipulación tridimensional limitada de las capas (como en un efecto CoverFlow) o cuando se utiliza CAReplicatorLayer para producir efectos de partículas.

+0

Terminé yendo con UIViews, principalmente porque la animación UIView con bloques es mucho más fácil de implementar en casos donde es importante ejecutar animaciones/tomar acciones sucesivamente. (Esos bloques de finalización son muy limpios, y usar una llamada de delegado 'animationDidStop' iba a ser una pesadilla para implementar en mi caso particular.) –

+1

@Greg - Sí, las nuevas animaciones de UIView basadas en bloques están bastante limpias. Sin embargo, puede obtener callbacks de finalización de bloques similares con CAAnimations utilizando '' setCompletionBlock: 'de CATransaction, que ejecutará un bloque al finalizar todas las animaciones envueltas en esa transacción. Solo algo en lo que pensar si es que quieres ir por ese camino. –

1

UIViews tienen subcapas, por lo que son de mayor peso, y contienen cosas que probablemente no necesites para las 50 imágenes, como eventos y controladores táctiles/variables. Entonces, usar capas probablemente sería un poco más eficiente y usaría un poco menos de memoria que usar vistas para cada imagen.

1

La diferencia para un número tan pequeño de imágenes es despreciable. Usa lo que es más conveniente.

+0

En mi experimentación, descubrí que aproximadamente 50 imágenes es lo que podía animar antes de tener un poco de tartamudeo en un iPhone 4. (Solo puedo suponer que este número varía mucho según el contenido/tamaño de las imágenes, cantidad de capas translúcidas debajo las imágenes animadas, etc.) –

+0

Y el modelo de teléfono: D – BallpointBen

0

No he hecho la animación (pero :-), pero las cosas que recuerdo haber leído al respecto sugieren crear una imagen con los 50 mosaicos y luego compensar con la imagen correcta al dibujar. De esta manera solo necesitas una capa o UIImage o lo que sea para mostrarlo. No sé acerca de la velocidad, pero supongo que ahorraría memoria y probablemente sería más fácil de administrar y codificar.

+0

En general, se lo conoce como "sprite" y se aplica a las animaciones OpenGL, pero en realidad no se aplica a CoreAnimation. –