12
votes

Méthode d'accès après la finition d'animation UIImageView

J'ai une gamme d'images chargées dans un UiImageView que j'imagine à travers un cycle. Une fois les images affichées, j'aimerais qu'un @Selector soit appelé afin de rejeter le contrôleur de vue actuel. Les images sont bien animées avec ce code: xxx

après les 16 secondes, je voudrais qu'une méthode soit appelée. J'ai regardé dans la méthode de la classe uiview setanimationDidstopSelector: mais je ne peux pas l'obtenir pour travailler avec ma mise en œuvre actuelle d'animation. Toute suggestion?

Merci.


0 commentaires

7 Réponses :


3
votes

Vous pouvez créer une minuterie pour tirer après la durée de votre animation. Le rappel pourrait traiter votre logique que vous souhaitez exécuter après la fin de l'animation. Dans votre rappel, assurez-vous que l'état de l'animation [uiImageView isaniming] au cas où vous voulez plus de temps pour que l'animation se termine.


0 commentaires

23
votes

Utiliser performselector: withObject: AfterDelay: code>: xxx pré>

ou utilisez DisPatch_ADTER CODE>: P>

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, instructions.animationDuration * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self animationDidFinish];
});


5 commentaires

Cette méthode semble fonctionner bien, merci rob! Mais je me demandais ce qui se produirait si pour une raison quelconque de la goutte de taux de trame de l'iPhone. Disons de 30 à 15. Dans ce cas, l'animation ne serait pas terminée de jouer lorsque la minuterie d'expédition est-elle sortie?


Pourquoi pensez-vous que la chute du taux de trame rendrait l'animation prendre plus de temps? Peut-être que la vue de l'image tombe des cadres s'il ne peut pas suivre.


C'est exactement le problème que j'ai avec performelector et retarder. Le tableau est trop lent pour charger et perd du temps. La précision est perdue. J'ai besoin d'une autre solution ...


Dispatch_After est inexact et ne peut pas être utilisé dans l'animation. Utiliser cadisplayLink à la place


CADISPAYLINK est bon pour la synchronisation des mises à jour d'affichage individuelles. Cette question concerne la détection de la fin d'une animation dont la durée n'est pas liée au taux de trame de l'écran. Toutefois, si je devais essayer de répondre à nouveau à cette question aujourd'hui, j'expédierais avec une animation uiimageview dans un Catransaction avec un bloc d'achèvement.



1
votes

dans imageview.m xxx


0 commentaires

8
votes

Il n'y a aucun moyen de le faire avec précision avec UiImageView. L'utilisation d'un retard fonctionnera la plupart du temps, mais il peut y avoir un décalage après la starantimation est appelé avant que l'animation ne se produise à l'écran, ce qui n'est pas précis. Plutôt que d'utiliser UiImageView pour cette animation, essayez d'utiliser un gâteauFrameinimation qui appellera une méthode de déléguée lorsque l'animation est terminée. Quelque chose le long de ces lignes: xxx

vient d'implémenter la méthode de déléguée d'animationDidstop


3 commentaires

Impossible d'ajouter CGIMAGE au tableau.


Pour vous débarrasser de l'avertissement causé par l'ajout de CCIMAGE à un tableau juste le jeter à ID.


Réponse modifiée pour réfléchir ci-dessus. Voir DOC DOC .



4
votes

Avec cette méthode, vous évitez les minuteries de tirer pendant que l'image d'image s'anime toujours en raison du chargement de l'image lente. Vous pouvez utiliser à la fois performselector: withObject: AfterDelay: et GCD de cette manière: xxx

/! \ auto.ImageView .Nanimationduration doit parier configuré avant startanimatima , sinon il sera 0

que si - (void) didfinishanimingImageView: Créer un arrière-plan File d'attente, effectuez un chèque sur la propriété ISANIMANT que d'exécuter le reste sur la file d'attente principale xxx


0 commentaires

23
votes

Vous pouvez utiliser simple cette catégorie UIIMAGEVIEW-AnimationCompletionBlock

et pour Swift fort> Version: UiImageView-AnimationImagesCompletionBlock P>

Jetez un coup d'oeil Sur le fichier README dans cette classe .. p>

Ajouter uiimageview + animationcompletion.h strong> et uiimageview + animationcompletion.m strong> fichiers dans le projet et qu'ils importent UiImageView + animationcompletion.h strong> Fichier où vous souhaitez utiliser ceci .. p>

pour par exemple, P>

NSMutableArray *imagesArray = [[NSMutableArray alloc] init];
for(int i = 10001 ; i<= 10010 ; i++)
    [imagesArray addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%d.png",i]]];

self.animatedImageView.animationImages = imagesArray;
self.animatedImageView.animationDuration = 2.0f;
self.animatedImageView.animationRepeatCount = 3;
[self.animatedImageView startAnimatingWithCompletionBlock:^(BOOL success){
 NSLog(@"Animation Completed",);}];


2 commentaires

Merci! C'est bien.


Je ne peux pas comprendre comment utiliser cela à Swift. Après avoir ajouté à la ponte en-tête, cela ne fonctionne toujours pas.



4
votes

Version SWIFT créée de gurpeet_singh Réponse (UiImageView + AnimationComplettion) Je n'ai pas pu créer une extension pour UiImageView, mais je crois que c'est assez simple à utiliser. XXX


1 commentaires

Fonctionne comme un charme que seule chose que j'ai ajoutée était animation.calcululationmode = .Discrete pour désactiver l'interpolation entre les cadres. Cela fait ressembler à un gif de FPS faible.