44 votes

Secouez l'effet visuel sur l'iPhone (ne secouez PAS l'appareil)

En cas d’échec de la connexion, je préférerais éviter d’afficher une alerte, c’est trop fugace. Afficher l'alerte, puis afficher le texte quelque part sur l'écran de connexion semble être une duplication.

Je souhaite donc que ma vue de connexion soit remuée de manière graphique lorsque l'utilisateur entre le mauvais identifiant et mot de passe, comme le fait l'écran de connexion Mac.

Quelqu'un sait s'il existe un moyen de résoudre ce problème ou si vous avez des suggestions pour un autre effet que je pourrais utiliser?

97voto

nielsbot Points 9551

Je pense que c'est une solution plus efficace:

 CAKeyframeAnimation * anim = [ CAKeyframeAnimation animationWithKeyPath:@"transform" ] ;
anim.values = @[ [ NSValue valueWithCATransform3D:CATransform3DMakeTranslation(-5.0f, 0.0f, 0.0f) ], [ NSValue valueWithCATransform3D:CATransform3DMakeTranslation(5.0f, 0.0f, 0.0f) ] ] ;
anim.autoreverses = YES ;
anim.repeatCount = 2.0f ;
anim.duration = 0.07f ;

[ viewToShake.layer addAnimation:anim forKey:nil ] ;
 

Un seul objet d'animation est créé et tout est exécuté au niveau CoreAnimation.

59voto

Chris Miles Points 2504

Utilisation des animations UIKit basées sur des blocs iOS 4+ (et vaguement basée sur la réponse de jayccrown):

 - (void)shakeView:(UIView *)viewToShake
{
    CGFloat t = 2.0;
    CGAffineTransform translateRight  = CGAffineTransformTranslate(CGAffineTransformIdentity, t, 0.0);
    CGAffineTransform translateLeft = CGAffineTransformTranslate(CGAffineTransformIdentity, -t, 0.0);

    viewToShake.transform = translateLeft;

    [UIView animateWithDuration:0.07 delay:0.0 options:UIViewAnimationOptionAutoreverse|UIViewAnimationOptionRepeat animations:^{
        [UIView setAnimationRepeatCount:2.0];
        viewToShake.transform = translateRight;
    } completion:^(BOOL finished) {
        if (finished) {
            [UIView animateWithDuration:0.05 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
                viewToShake.transform = CGAffineTransformIdentity;
            } completion:NULL];
        }
    }];
}
 

40voto

jayccrown Points 389

J'avais vu une animation de vobulation et l'avais modifiée pour faire basculer une vue en pixels verticalement et verticalement:

 - (void)earthquake:(UIView*)itemView
{
    CGFloat t = 2.0;

    CGAffineTransform leftQuake  = CGAffineTransformTranslate(CGAffineTransformIdentity, t, -t);
    CGAffineTransform rightQuake = CGAffineTransformTranslate(CGAffineTransformIdentity, -t, t);

    itemView.transform = leftQuake;  // starting point

    [UIView beginAnimations:@"earthquake" context:itemView];
    [UIView setAnimationRepeatAutoreverses:YES]; // important
    [UIView setAnimationRepeatCount:5];
    [UIView setAnimationDuration:0.07];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(earthquakeEnded:finished:context:)];

    itemView.transform = rightQuake; // end here & auto-reverse

    [UIView commitAnimations];
}

- (void)earthquakeEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{
    if ([finished boolValue]) 
    {
    	UIView* item = (UIView *)context;
    	item.transform = CGAffineTransformIdentity;
    }
}
 

8voto

Justin Gallagher Points 2514

Voici un tutoriel qui explique comment le faire dans Cocoa. Devrait être le même pour l'iPhone (ou au moins assez similaire).

http://www.cimgf.com/2008/02/27/core-animation-tutorial-window-shake-effect/

6voto

slf Points 15327

Changer simplement la coordonnée X de la propriété center de votre vue peut faire l'affaire. Si vous n'avez pas fait d'animation de base avant, c'est assez simple.

Commencez par lancer une animation à droite, puis écoutez-la pour qu'elle se termine, puis revenez à gauche et ainsi de suite. Réduire le temps pour qu'il se "sent bien" peut prendre un certain temps.

 - (void)animationFinishCallback:(NSString *)animationID finished:(BOOL)finished context:(void *)context
{
  if ([animationID isEqualToString:@"MoveRight"]) {
    [UIView beginAnimations:@"MoveLeft" context:NULL];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelay: UIViewAnimationCurveEaseIn];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationFinishCallback:finished:context:)];

    myView.center = CGRectMake(newX, newY);
    [UIView commitAnimations];
  }
}
 

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