142 votes

iPhone UIView Animation Best Practice

Quelle est la meilleure pratique pour animer les transitions de vues sur l'iPhone ?

Par exemple, le ViewTransitions L'exemple de projet d'apple utilise un code comme :

CATransition *applicationLoadViewIn = [CATransition animation];
[applicationLoadViewIn setDuration:1];
[applicationLoadViewIn setType:kCATransitionReveal];
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal];

mais il y a aussi des bouts de code flottant sur le net qui ressemblent à ça :

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];
[myview removeFromSuperview];
[UIView commitAnimations];

Quelle est la meilleure approche ? Si vous pouviez également fournir un extrait, ce serait très apprécié.

NOTE : Je n'ai pas réussi à faire fonctionner correctement la deuxième approche.

119voto

Rafael Vega Points 2250

De la Référence UIView La section de l'article sur le beginAnimations:context: méthode :

L'utilisation de cette méthode est déconseillée à partir de la version 4.0 de l'iPhone OS. Vous devriez plutôt utiliser les méthodes d'animation par blocs.

Eg de l'animation à base de blocs basée sur le commentaire de Tom

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];

69voto

mahboudz Points 23653

J'ai utilisé ce dernier pour un grand nombre d'animations légères et agréables. Vous pouvez l'utiliser pour faire un fondu enchaîné de deux vues, ou un fondu en avant d'une autre, ou un fondu en arrière. Vous pouvez faire passer une vue par-dessus une autre comme une bannière, vous pouvez faire en sorte qu'une vue s'étire ou rétrécisse... J'ai fait beaucoup d'usage de beginAnimation / commitAnimations .

Ne pense pas que tu ne peux faire que ça :

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];

En voici un exemple :

[UIView beginAnimations:nil context:NULL]; {
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    if (movingViewIn) {
// after the animation is over, call afterAnimationProceedWithGame
//  to start the game
        [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)];

//      [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation
//      [UIView setAnimationDelay:0.50];
//      [UIView setAnimationRepeatAutoreverses:YES];

        gameView.alpha = 1.0;
        topGameView.alpha = 1.0;
        viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height);
        viewrect2.origin.y = -20;

        topGameView.alpha = 1.0;
    }
    else {
    // call putBackStatusBar after animation to restore the state after this animation
        [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)];
        gameView.alpha = 0.0;
        topGameView.alpha = 0.0;
    }
    [gameView setFrame:viewrect1];
    [topGameView setFrame:viewrect2];

} [UIView commitAnimations];

Comme vous pouvez le voir, vous pouvez jouer avec l'alpha, les cadres, et même les tailles d'une vue. Jouez avec. Vous serez peut-être surpris par ses capacités.

52voto

Ryan McCuaig Points 1416

La différence semble être le degré de contrôle dont vous avez besoin sur l'animation.

El CATransition vous donne plus de contrôle et donc plus de choses à configurer, par exemple la fonction de chronométrage. Étant donné qu'il s'agit d'un objet, vous pouvez le stocker pour plus tard, le remanier de manière à ce que toutes vos animations soient dirigées vers lui afin de réduire la duplication du code, etc.

El UIView sont des méthodes pratiques pour les animations courantes, mais elles sont plus limitées que les méthodes de la classe CATransition . Par exemple, il n'existe que quatre types de transition possibles (flip left, flip right, curl up, curl down). Si vous voulez faire un fade in, vous devez soit creuser jusqu'à CATransition's transition en fondu, ou mettre en place une animation explicite de votre UIView de l'alpha.

Notez que CATransition sur Mac OS X vous permettra de spécifier une valeur arbitraire de CoreImage pour l'utiliser comme transition, mais en l'état actuel des choses, vous ne pouvez pas le faire sur l'iPhone, qui ne dispose pas de CoreImage .

26voto

Akhildas Points 1744

Nous pouvons animer des images dans ios 5 en utilisant ce simple code.

CGRect imageFrame = imageView.frame;
imageFrame.origin.y = self.view.bounds.size.height;

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        imageView.frame = imageFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];

8voto

Chris Points 13472

Dans le UIView consultez la documentation sur cette fonction pour ios4+

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X