2010-05-05 11 views
31

Tengo una animación usando un UIImageView¿Puedo detener UIImageView Animation en el último fotograma?

myAnimatedView.animationImages = myImages; 
myAnimatedView.animationDuration = 1; 
myAnimatedView.animationRepeatCount = 1; 
[myAnimatedView startAnimating]; 

¿Cómo puedo saber a la animación para detener en el último fotograma o que sean visibles último fotograma de la serie de imágenes?

gracias de antemano

Respuesta

6

Después de la animación termina puede configurar su imagen UIImageView al último fotograma de la animación.

myAnimatedView.image = [myAnimatedImages objectAtIndex:myAnimatedImages.count - 1] 

No creo que hay un método delegado que le avise en caso animationFinish por lo que se necesita para iniciar un NSTimer con misma duración que la animación para obtener la notificación.

UIImageViewAnimation documentation

+0

En realidad se puede olvidar el 'NSTimer' - siempre y cuando su imagen se animando, el' animationImages' mostrará hasta que termine la animación, entonces la imagen ' 'se mostrará. – pix0r

+0

Esto realmente ya no funciona en iOS4, digo. Tratando de encontrar una solución, pero mi aplicación funciona bien en 3. Parece que animationImages borra la propiedad de la imagen ahora. – typeoneerror

+0

Lo mismo aquí, mi aplicación de repente se volvió defectuosa con iOS 4. Y no hay ningún delegado que me permita volver a poner la imagen correcta. – asandroq

71

la propiedad imagen de la clase UIImageView tiene los siguientes documentos: "Si la propiedad animationImages contiene un valor distinto de cero, no se utilizan los contenidos de esta propiedad."

Así que el truco para mantener el último fotograma de una animación en iOS4 es establecer primero la propiedad de la imagen en ese último fotograma (mientras animationImages sigue siendo nula), establecer la propiedad animationImages y llamar a startAnimating. Cuando finaliza la animación, se muestra la propiedad de la imagen. No se necesita devolución de llamada/delegado.

+26

Acabo de probar esto en iOS5, funciona. Puse 'animation.image = [myAnimatedView.animationImages lastObject];' justo antes de '[myAnimatedView startAnimating];' y la animación se detiene en la última imagen. – mahboudz

+1

Eso no tiene sentido en esa documentación; si hiciera lo que decía, la asignación de la imagen no haría nada. Los documentos están equivocados: la propiedad de la imagen * es * utilizada, mientras que la imagen no está animando. –

+0

Solo para aclarar: la solución de mahboudz funciona incluso con archivos PNG o GIF con partes transparentes. El "principal" imageView.image solo entra en efecto _después_ la animación se ha ejecutado, y no "brilla a través" de partes transparentes durante la animación si se establece en este punto (probado en iOS 5, 6, 7). – Janosch

13

Puede establecer la imagen del último fotograma en su instancia de UIImageView y luego, cuando finalice la animación, la imagen del último fotograma permanecerá visible. Aquí está el código:

// create your array of images 
NSArray *images = @[[UIImage imageNamed:@"video1.png"], [UIImage imageNamed:@"video2.png"]]; 
UIImageView *imageView = [UIImageView new]; 
imageView.image = images.lastObject; 
imageView.animationImages = images; 
imageView.animationDuration = 1.0; // seconds 
imageView.animationRepeatCount = 1; 
[imageView startAnimating]; 
+0

lo que harás si todas las imágenes son png (transparentes), entonces la imagen de fondo claramente se puede ver – Amitabha

-1

se ha marcado la propiedad removedOnCompletion de la animación de rotación en NO, por ejemplo, rota.removedOnCompletion = NO;

Eso debería dejar la capa de presentación donde estaba cuando finalizó la animación. El valor predeterminado es SÍ, que retrocederá al valor del modelo, es decir, el comportamiento que describe. El modo de llenado también debe establecerse,

es decir, rota.fillMode = kCAFillModeForwards;

1

acabo de tirar una UIView que sostiene el primer cuadro en la parte superior de la UIView animación ... que la vista de la animación ocultos y establecer su imagen como el último cuadro ... y luego tener que intercambien propiedades ocultas durante el proceso de .

so... just before your last line... 
// quickly hide the view that only holds the first frame 
myOtherView.hidden = YES; 
// start the animation 
[myAnimatedView startAnimating]; 
// show the animation view 
myAnimatedView.hidden = NO; 
// BAM, done. It will use the last image when it ends. 

Menos código, más IB, siempre que sea posible.

-1

Puede detener la animación estableciendo la propiedad UIImageView animateImg.animationDuration = 1

1

que he logrado esto mediante la creación de una subclase de UIImageView, anulando startAnimating() y establecer la propiedad de imagen a ser la última imagen de la matriz de la imagen antes de llamar a super.startAnimating(). Esto, además de establecer animationRepeatCount en 1, logra el efecto deseado.

Aquí es mi clase Swift:

class SuccessAnimationImageView: UIImageView { 

var duration: NSTimeInterval = 2 

override func didMoveToSuperview() { 
    super.didMoveToSuperview() 
    setupImages() 
} 

override func startAnimating() { 
    setLastFrame() 
    super.startAnimating() 
} 

func setupImages() { 
    animationImages = ImageHelper.successAnimationImages 
    image = animationImages?.first 
    animationRepeatCount = 1 
} 

func setLastFrame() { 
    image = animationImages?.last 
} 
} 
+0

Sí, es importante que esté configurada antes de la llamada a 'startAnimating()'. Establecer 'self.image' * después de * llamar' startAnimating() 'no tiene ningún efecto. –

Cuestiones relacionadas