2011-11-07 16 views
13

Me parece que la primera vez que ejecuto una animación (animar el marco de una UIView, o la posición de un CALayer, etc.) es bastante entrecortada, y las animaciones posteriores son suaves.¿Por qué las animaciones de iOS son lentas la primera vez que se ejecutan?

¿Qué estaría causando esto, y hay alguna forma de precachear la animación?

Nota: esta pregunta es bastante similar a esta: UIImageView animations lag at first run, pero los UIImages no se están utilizando en mis animaciones.

+0

Usted ha mencionado que este es un duplicado de [animaciones UIImageView se quedan en la primera carrera] (http://stackoverflow.com/questions/ 3382478/uiimageview-animations-lag-at-first-run). – Moshe

+0

Eso es verdad, lo hice. Supongo que no es tanto un duplicado como pensé, porque no estoy tratando con UIImages en mis animaciones. Editado esa parte de la pregunta. – ryleigh

+0

@ryleigh - Muy bien. Sin embargo, es una buena pregunta, así que tenga un voto positivo. – Moshe

Respuesta

0

Suponiendo que está utilizando [UIImage imageNamed: @"herp.png"], la imagen se almacenará en caché. Si la imagen se dibuja mucho, se desempaquetará en la memoria, de lo contrario, se cargará la imagen de manera perezosa y se producirá un tartamudeo.

+0

Las animaciones que me preocupan no son UIImages, aunque es bueno saberlo. Para ser específico, en un caso estoy eliminando un UITextView de su padre, agregándolo a otra vista, y usando '[UIView animate ...]' para animar su fotograma. La primera vez que lo ejecuta tartamudea, y después de volver a su vista original y la animación se activa nuevamente, es suave. – ryleigh

+0

Esto incluye la representación de cualquier artículo. Si el texto nunca se edita, solo tendrá que renderizarse una vez. Esto aún puede estar causando su problema. Sin embargo, después de leer tus otras publicaciones es más que probable que tenga algo que ver con que aparezca tu teclado. – Nico

0

Ejecútelo en viewDidAppear, en lugar de viewWillAppear. El almacenamiento en caché debe ocurrir después de que aparezca la imagen , y debería tener el mismo aspecto para el usuario.

+0

Bueno, las animaciones que estoy tratando son en respuesta a la entrada del usuario, por lo que no puedo reproducirlas correctamente cuando aparece la vista. Utilicé 'viewWillAppear' porque esperaba que hubiera alguna forma de reproducirlos antes de que el usuario pudiera verlos (lo cual suena tonto). – ryleigh

+0

Impar ¿Estás utilizando los métodos [UIView beginAnimations] o los métodos basados ​​en bloques [UIView animateWithDuration: animations: ...]? ¿Qué propiedades estás animando? ¿Algo más que marco? ¿Cuántos de qué tipo de objeto? – Tim

+0

Bueno, en un caso estoy eliminando un UITextView de su principal, agregándolo a otra vista y usando [UIView animateWithDurationsEtc ...] para animar su fotograma. Aunque al mismo tiempo se reproduce la animación, se convoca el teclado, por lo que empiezo a sospechar que la creación del teclado es lo que hace que la animación tartamudee en ese caso. ¿Tiene sentido que el teclado esté ahora en la memoria caché en alguna parte, para que no tenga que volver a crearse la próxima vez que se necesite? Si es así, ¿hay alguna manera de preiniciarlo? – ryleigh

2

Si tiene un TextField, que supongo que es lo que recibe su entrada del usuario. Utilizar los métodos UITextFieldDelegateDid y no Should

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//Do textfield animations and other view animations here

}

No hacer sus animaciones en;

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
//Don't do textfield animations and other view animations here
//This is where the system does its own animations; raising the keyboard, etc
}

+0

¿Cuál es el motivo técnico de su sugerencia? ¿Por qué las animaciones no se ejecutan sin problemas en "debería"? –

Cuestiones relacionadas