faire une animation en boucle

yodarkyodark Membre
12:51 modifié dans API UIKit #1
Bonjour,

J'ai un petit problème je voudrais faire une animation qui agrandit une image puis la rétrécis genre un effet bounce. Le problème de mon code est que seule la dernière animation est jouée une seule fois.

Comment faire pour faire deux animations de suite ?

CGRect oldFrame = image.frame ;<br />	<br />	for(int i = 0; i &lt;= nbOccurences ; i++) {<br />	<br />		<br />		[UIView beginAnimations:nil context:self];<br />		[UIView setAnimationDuration:3.5];<br />		<br />		image.frame = CGRectMake(4,7,207,290) ;<br />		[UIView commitAnimations];<br />		<br />		[self.view setNeedsDisplay];<br />		<br />		<br />		[UIView beginAnimations:nil context:self];<br />		[UIView setAnimationDuration:3.5];<br />		<br />		image.frame = oldFrame ;<br />		[self.view setNeedsDisplay];<br />		[UIView commitAnimations];<br />		<br />		<br />	}<br />

Réponses

  • CeetixCeetix Membre
    12:51 modifié #2
    Faut pas regarder du côté des threads ?
  • yodarkyodark Membre
    12:51 modifié #3
    Ok mais comment exactement ?

    J'ai essayé d'ajouter un

    [NSThread sleepForTimeInterval:0.6];

    entre les deux animation afin d'attendre mais ca ne fonctionne pas. C'est toujours la dernière animation qui est jouée
  • AliGatorAliGator Membre, Modérateur
    juin 2009 modifié #4
    Faut regarder du côté de la doc de CoreAnimation plutôt. Les threads ne vont pas t'être utiles dans ce cas (le multithreading de l'animation est déjà  géré par CoreAnimation)

    Le problème c'est que les méthodes genre [tt][UIView beginAnimations:... context:...][/tt] et [tt][UIView commitAnimations][/tt] ne font qu'indiquer à  la boucle de rendu que les propriétés modifiées entre ces 2 appels devront être animées... lorsque la boucle de rendu se chargera de mettre l'écran à  jour, plus tard.
    Ce qui fait qu'au final faire suivre plusieurs blocs beginAnimations/commitAnimations comme tu fais n'a pour effet que de jouer la dernière ou plutôt de jouer "le cumul des animations" toutes ensemble d'un coup.

    Pour les enchaà®ner, il faut faire usage des delegate sur les animations, et déclencher l'animation suivante uniquement lorsque le delegate reçoit l'information que l'animation précédente est terminée.

    Le plus simple pour cela est de ne mettre dans ta méthode principale que le premier bloc [tt][UIView beginAnimations:... context:...]...[UIView commitAnimations][/tt], et d'utiliser à  l'intérieur de ce bloc [tt][UIView setAnimationDidStopSelector:@selector(startSecondPartForAnimation:finished:context:)][/tt] pour que cette méthode soit appelée quand ta première animation est terminée. Du coup il suffitd'implémenter cette 2e méthode [tt]-(void)tartSecondPartForAnimation:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context[/tt] pour mettre dedans ta 2e partie avec ton 2e bloc [tt][UIView beginAnimations:... context:...]...[UIView commitAnimations][/tt].
Connectez-vous ou Inscrivez-vous pour répondre.