2010-05-05 3 views
31

J'ai une animation à l'aide d'un UIImageViewPuis-je arrêter UIImageView Animation à la dernière image?

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

Comment puis-je dire à l'animation d'arrêter à la dernière image ou être visible dernière image de la série d'images?

Nous vous remercions à l'avance

Répondre

6

Après l'animation que vous termine pouvez configurer votre image UIImageView à la dernière image de votre animation.

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

Je ne pense pas qu'il y ait une méthode déléguée qui vous informe sur animationFinish événement afin que vous devez commencer un NSTimer avec la même durée que l'animation pour obtenir la notification.

UIImageViewAnimation documentation

+0

Vous pouvez réellement oublier la 'NSTimer' - tant que votre image est anime, la' animationImages' affiche jusqu'à ce que l'animation est terminée, le 'l'image 's'affichera. – pix0r

+0

Cela ne fonctionne plus sur iOS4, FYI. Essayer de trouver une solution de contournement, mais mon application fonctionne correctement sur 3. On dirait que l'animation efface la propriété de l'image maintenant. – typeoneerror

+0

Même ici, mon application a soudainement buggé avec iOS 4. Et il n'y a pas de délégué pour me laisser remettre l'image correcte. – asandroq

71

la propriété d'image sur la classe UIImageView a les documents suivants: « Si la propriété animationImages contient une valeur autre que zéro, le contenu de cette propriété ne sont pas utilisés. » Donc, l'astuce pour conserver la dernière image d'une animation dans iOS4 est de définir d'abord la propriété image sur cette dernière image (alors que animationImages est toujours nulle), puis de définir la propriété animationImages et d'appeler startAnimating. Lorsque l'animation est terminée, la propriété d'image est ensuite affichée. Aucun rappel/délégué requis.

+26

Je viens d'essayer cela sur iOS5 cela fonctionne. Je mets 'animation.image = [myAnimatedView.animationImages lastObject];' juste avant '[myAnimatedView startAnimating];' et l'animation s'arrête à la dernière image. – mahboudz

+1

Cela n'a pas de sens à partir de cette documentation; s'il faisait ce qu'il disait, assigner une image ne ferait rien. Les documents sont erronés - la propriété image * est * utilisée, tandis que l'image n'est pas animée. –

+0

Juste pour clarifier: la solution de mahboudz fonctionne même avec des fichiers PNG ou GIF avec des parties transparentes. Le "principal" imageView.image n'entrera en vigueur qu'après l'exécution de l'animation, et ne "brillera" pas les parties transparentes au cours de l'animation si elle est définie à ce stade (testée sur iOS 5, 6, 7). – Janosch

13

Vous pouvez définir l'image de la dernière image sur votre instance UIImageView, puis, une fois l'animation terminée, l'image de la dernière image reste visible. Voici le code:

// 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

ce que vous ferez si toutes les images sont png (transparent), alors l'image de fond clairement vous pouvez voir – Amitabha

-1

Avez-vous définissez la propriété removedOnCompletion de l'animation de rotation NO, par exemple, rota.removedOnCompletion = NO;

Cela devrait laisser la couche de présentation à l'endroit où elle se trouvait à la fin de l'animation. La valeur par défaut est YES, qui revient à la valeur du modèle, c'est-à-dire le comportement que vous décrivez. Le paramètre fillMode doit également être défini,

, c'est-à-dire rota.fillMode = kCAFillModeForwards;

1

Je viens de lancer une UIView tenant la première image sur le dessus du UIView d'animation ... faire le point de vue de l'animation cachée et définir son image comme la dernière image ... et ensuite les propriétés cachées changent au cours du processus .

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. 

Moins de code, plus IB, autant que possible.

-1

Vous pouvez arrêter l'animation en définissant la propriété UIImageView animateImg.animationDuration = 1

1

J'ai réalisé en créant une sous-classe de UIImageView, remplaçant startAnimating() et définir la propriété d'image à la dernière image dans votre tableau d'image avant d'appeler super.startAnimating(). Cela permet de définir l'animationRepeatCount sur 1 pour obtenir l'effet souhaité.

Voici ma classe 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

Oui c'est important qu'il soit placé avant l'appel de 'startAnimating()'. Définir 'self.image' * après * appel' startAnimating() 'n'a aucun effet. –

Questions connexes