Succéssion de flash .
Salut tout le monde !
Voilà , j'essaie de faire une petite application qui fera flasher l'écran de l'iphone.
Pour se faire j'ai créé ne View où je mets un bouton "flash" qui déclanchera une succession de flash quand j'appuierai dessus.
J'ai ensuite créé une autre view(appelée "page") que je place par dessus mon écran (donc première view et bouton), que je met en blanc et dont le alpha est à 0.00 .
J'ai essayé plusieurs fois de créer ce flash mais je n'arrive jamais à faire succéder deux animation à la suite.
Exemple de code :
Déjà il ne fait pas le deux animations mais juste la derniere. Quand je clique sur flash il me met directement du blanc et ensuite fait en 0,2 seconde le alpha 1.00 to 0.00.
Comment faire ?
Voilà , j'essaie de faire une petite application qui fera flasher l'écran de l'iphone.
Pour se faire j'ai créé ne View où je mets un bouton "flash" qui déclanchera une succession de flash quand j'appuierai dessus.
J'ai ensuite créé une autre view(appelée "page") que je place par dessus mon écran (donc première view et bouton), que je met en blanc et dont le alpha est à 0.00 .
J'ai essayé plusieurs fois de créer ce flash mais je n'arrive jamais à faire succéder deux animation à la suite.
Exemple de code :
<br />- (IBAction)flash {<br /> [UIView beginAnimations:nil context:NULL];<br /> [UIView setAnimationDuration:0.2];<br /> page.alpha = 1.00;<br /> [UIView commitAnimations];<br /><br /> [UIView beginAnimations:nil context:NULL];<br /> [UIView setAnimationDuration:0.2];<br /> mapage.alpha = 0.00;<br /> [UIView commitAnimations]<br /> }<br /><br />
Déjà il ne fait pas le deux animations mais juste la derniere. Quand je clique sur flash il me met directement du blanc et ensuite fait en 0,2 seconde le alpha 1.00 to 0.00.
Comment faire ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu regardes deux topics avant
[UIView setAnimationDidStopSelector:@selector(la methode qui reçoit )];
La méthode qui reçoit doit avoir trois arguments (voir la doc de UIView et les exemples de renvoi)
En fait, il faut bien comprendre que Core Animation (on va dire CA pour faire plus court), qu'on soit sur Mac ou iPhone, est multithreadé (il fonctionne en parallèle de l'application). Lorsqu'on passe dans un méthode et qu'on appelle une fonctionnalité de CA, une transaction implicite est créée. Toutes les actions réalisées dans la méthode ne seront effectuées qu'après la fin de la méthode. Donc dans ton cas la première animation ne va pas être prise en compte puisque CA ne voit que les modifications de la deuxième.
Comment faire alors? Et bien on utiliser des transactions explicite de la forme:
Mais cela ne suffit pas. Dans cet exemple, les deux animations vont s'exécuter mais la seconde va très (trop) vite remplacée la première. CA n'aura sans doute même pas le temps de prendre en compte la première. Il nous faut donc d'une part forcer la prise en compte et d'autre part attendre un peu pour qu'elle est le temps de s'exécuter. On fera donc plutôt quelque chose comme ça:
Cet usage est par contre plus contraignant que la méthode donnée par Philippe car comme on bloque le thread principal (ce qui n'est pas le cas avec un delegate) on empêche toute action de l'utilisateur pendant ce temps. Mais d'un autre côté cela peu être un avantage dans certains cas où on veux justement modifier l'interface sans que l'utilisateur puisse intervenir pendant ce temps sur d'autres layers.
L'utilisation des transactions explicites est aussi très pratique lorsqu'on veut par exemple bouger un layer à la souris. On peut alors cout-circuiter directement le temps d'animation de la manière suivante:
Après pour des choses plus élaborées, on va effectivement se recentrer vers les animations.
J'avais aussi essayé avec un NSTimer pour lancer la seconde animation (ou en jouant sur la property delay), mais le problème est que la durée réelle du thread de l'animation (duration) est très imprécise par rapport à celle demandée.
En pratique je remarque aussi qu'on ne peut pas commiter 2 animations à la suite (enfin si on peut mais on ne verra que la dernière), mais quand je lis la doc : Ainsi que En lisant ces deux choses là , ça me laisse penser que d'une part la première méthode permet d'empiler plusieurs animations et que si on laisse à NO elle vont s'enchaà®ner, attendant que la première ait fini pour lancer la 2e (alors qu'en pratique ce n'est pas le cas)... Mais aussi qu'on peut "empiler les animations les unes au dessus des autres" comme ils disent, et qu'on peut imbriquer les blocs d'animations, genre Mais ça n'a pas l'air de marcher mieux...
Alors, doc mal foutue, laissant croire qu'on peut empiler et enchaà®ner les animations aussi simplement (plutôt que d'attendre la delegate method pour lancer la suivante) ? ou astuce de sioux qu'on a pas vue qui permettrait de faire marcher ça comme le laisse entendre la doc ? Ou mauvaise traduction de la doc de ma part ? ???
En fait un essai
[UIView beginAnimations:@toto context:NULL];
[UIView setAnimationDuration:2.];
myView.center=CGPointMake(myView.center.x+10.,myView.center.y+10.);
[UIView beginAnimations:@titi context:NULL];
[UIView setAnimationDuration:2.];
myView.layer.opacity/=2.;
[UIView commitAnimations];
[UIView commitAnimations];
réalise les deux animations en simultané
[UIView beginAnimations:@toto context:NULL];
[UIView setAnimationDuration:2.];
myView.center=CGPointMake(myView.center.x+10.,myView.center.y+10.);
[UIView beginAnimations:@titi context:NULL];
[UIView setAnimationDuration:2.];
myView.center=CGPointMake(myView.center.x+10.,myView.center.y+10.);
[UIView commitAnimations];
[UIView commitAnimations];
Du coup pour moi la doc nous ment, elle nous fait croire qu'on peut cumuler des animations de façon séquentielle avec ce mécanisme, alors que c'est même pas vrai, la vilaine !
Non, le premier exemple essayé est sur des properties différentes , par contre c'est la même view, donc le même layer. Essayons avec des vues différentes :
[size=12pt]essai n°3[/size]
[UIView beginAnimations:@toto context:NULL];
[UIView setAnimationDuration:2.];
[UIView setAnimationDelegate:self];
[UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
myView.center=CGPointMake(myView.center.x+10., myView.center.y+10.);
[UIView beginAnimations:@titi context:NULL];
[UIView setAnimationDuration:5.];
[UIView setAnimationDelegate:self];
[UIView setAnimationWillStartSelector:@selector(animationWillStart:context:)];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
button.center=CGPointMake(myView.center.x+10., myView.center.y+10.);
//lineView.layer.opacity/=2.;
[UIView commitAnimations];
[UIView commitAnimations];
}
-(void) animationWillStart:(NSString*)animId context:(void*)context {
NSLog(@start);
}
-(void) animationDidStop:(NSString*)animId finished:(BOOL) flag context:(void*)context {
NSLog(@stop);
}
[size=12pt]Résultat :[/size]
[Session started at 2008-11-05 20:38:12 +0100.]
2008-11-05 20:38:16.530 MovingAndSubviews[4765:20b] start
2008-11-05 20:38:16.531 MovingAndSubviews[4765:20b] start
2008-11-05 20:38:18.528 MovingAndSubviews[4765:20b] stop
2008-11-05 20:38:21.528 MovingAndSubviews[4765:20b] stop
Même date de départ ...