2011-11-25 12 views
7

Probablemente me voy a la misma pregunta que fue hecha por otra persona (pero no tiene las respuestas):
Speed up first UIImageView animation (force cache the images)

Pero, Mi pregunta corta es:
tengo 60 imágenes en los recursos, en bucle I TimeInterval Voy a animar esas imágenes, configurando cada vez a UIImageView.image la n'th imagen desde el recurso. El problema es: primera animación es malo! Cuando vuelvo a enlazar todas las imágenes en el mismo UIImageView, la animación es perfecta. ¿Podemos precachear imágenes en UIImageView?

EDITAR: ¿O tal vez podamos hacer algunos trucos para que la animación sea fluida?¿UIImageView imágenes de caché?

Respuesta

17

El método [UIImage imageNamed:@""] cachés de la imagen. UIImageView no. Tuve un problema en una aplicación con muchas imágenes que se bloquea debido a la poca memoria. Para corregir si cambié a [UIImage imageWithContentsOfFile:@""] que no almacena en caché la imagen.

Para precachear la imagen, simplemente puede llamar al [UIImage imageNamed:@""] para todas las imágenes que desee en el método init. Pero si recibe una advertencia de memoria, las imágenes serán desasignadas.

+0

Tal vez, pero estamos hablando de UIImageView, no UIImage – beryllium

+0

Lo siento. Se corrigió la respuesta. –

+0

¡SÍ! Durante la aplicación de creación de perfiles con el uso de 'imageNamed', mi aplicación tomó 120mb de memoria, cuando se usa la memoria' imageWithContentsOfFile' es 15mb.Pero lamentablemente no resuelve el problema de la mala animación ( –

2

No, UIImageView no almacena imágenes en caché. image propiedad declarada como retener, por lo que cuando establece una nueva imagen, entonces imageView envía el mensaje release a la imagen anterior y retain a uno nuevo.

La forma más fácil para animar UIImageView es fijar serie de imágenes a la propiedad animationImages y llame startAnimating método

imageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"1.png"], ..., nil]; 
imageView.animationDuration = 2.0f; 
[imageView startAnimating]; 
+0

Pero, ¿alguna vez ha intentado animar 100 imágenes, cada una con un tamaño de 850x535 usando UIImageView.animationImages? Lo he intentado, la aplicación se colgó debido a la memoria ... La razón por la que creo que es, porque las imágenes animadas contienen todas las imágenes, que son mucha memoria. O, ¿estoy diciendo algo malo? Si es así, por favor corrígeme. Thx –

+0

Sí, supongo que tienes razón. De esta manera es más fácil, pero no eficiente como puedes ver. – beryllium

+0

¿Qué piensas, debería usar alguna biblioteca de gráficos para jugar con imágenes grandes, manteniendo el rendimiento bueno? ¿Conoce alguna? Thx –

4

UIImageView no almacena en caché la imagen, como [UIImage imageNamed:@""]. Desafortunadamente, si tiene muchas imágenes, imageNamed bloqueará su aplicación porque se queda sin memoria.

Puede precargar todas las imágenes en un NSArray usando [UIImage imageWithContensOfFile:@""]. ¡Una vez que tenga la matriz, puede hacer lo que quiera!

+1

¡Creo que es extraño! .. NSArray también mantendrá la memoria de las imágenes dentro de sí misma, así como las imágenes almacenadas en caché por imageNamed. ¿O? –

Cuestiones relacionadas