Je me demande quel est le meilleur moyen de mettre en œuvre unsérie d'animations différentes. Si j'appelle la méthode suivante et essaie d'animer le même objet à droite, à gauche et en haut, par exemple, cela ne fonctionnera pas, car le compilateur ne les traitera pas de manière linéaire, et je me retrouverai avec mon objet simplement monter (en sautant les marches pour aller à droite et à gauche):
-(IBAction)clickStart
{
[self Animation1];
[self Animation2];
[self Animation3];
}
Maintenant, je pourrais le faire, mais cela me semble lourd et bizarre. Considérez ceci comme la méthode pour Animation1:
[pageShadowView setFrame:CGRectMake(100, 0, CGRectGetWidth(pageShadowView.frame), CGRectGetHeight(pageShadowView.frame))];
[UIView beginAnimations:@"Animation1" context:nil]; // Begin animation
[UIView setAnimationDuration:0.5];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(Animation2)];
[pageShadowView setFrame:CGRectMake(200, 0, CGRectGetWidth(pageShadowView.frame), CGRectGetHeight(pageShadowView.frame))];
[UIView commitAnimations]; // End animations
Et puis, je pourrais faire la même chose dans Animation2, c.-à-d. appeler Animation3 une fois que c'est fait. Mais pour être honnête, cette méthode de codage est très déroutante et peu claire. Est-il possible d'obtenir un code plus "linéaire" comme celui que j'ai suggéré au début (ce qui ne fonctionne pas), ou devrais-je simplement vivre avec la méthode de sélection?
Merci pour toutes les suggestions!
Réponses:
10 pour la réponse № 1Si vous ne devez pas prendre en charge iOS <4:
[UIView animateWithDuration:0.2 animations:^{
// animation 1
} completion:^(BOOL finished){
[UIView animateWithDuration:0.2 animations:^{
// animation 2
} completion^(BOOL finished){
[UIView animateWithDuration:0.2 animations:^{
// animation 3
}];
}];
}]
2 pour la réponse № 2
Nous avons créé un composant pour le chaînage d'étapes d'animation de manière déclarative à l'aide de blocs (CPAnimationSequence sur Github).
Il vous donne un code très lisible, quelque chose comme ceci:
[[CPAnimationSequence sequenceWithSteps:
[CPAnimationStep for:0.25 animate:^{ self.imageView.alpha = 0.0; }],
[CPAnimationStep for:0.25 animate:^{ self.headline.alpha = 0.0; }],
[CPAnimationStep for:0.25 animate:^{ self.content.alpha = 0.0; }],
[CPAnimationStep after:1.0 for:0.25 animate:^{ self.headline.alpha = 1.0; }],
[CPAnimationStep for:0.25 animate:^{ self.content.alpha = 1.0; }],
nil]
runAnimated:YES];
Par rapport à l'approche traditionnelle basée sur des blocs (bien décrite par Max), elle a l'avantage de faire correspondre l'intention et sa représentation: a séquence linéaire d'étapes à animer. Nous avons développé ce sujet dans un article sur notre blog de développement iOS.