UIView animateKeyframesWithDuration vs standard bloc d'animation animation diffèrent

J'ai récemment trouvé des UIView code d'animation et a remarqué qu'il n'était pas à l'aide de la animateKeyframesWithDuration:delay:options:animations:completion: méthode correctement et ont depuis été d'essayer de le réparer, mais pour une raison quelconque, les animations ne sont pas identiques.

Voici le code que j'ai trouvé:

view.transform = CGAffineTransformMakeTranslation(300, 0);

[UIView animateKeyframesWithDuration:duration/4 delay:delay options:0 animations:^{
    //End
    view.transform = CGAffineTransformMakeTranslation(-10, 0);
} completion:^(BOOL finished) {
    [UIView animateKeyframesWithDuration:duration/4 delay:0 options:0 animations:^{
        //End
        view.transform = CGAffineTransformMakeTranslation(5, 0);
    } completion:^(BOOL finished) {
        [UIView animateKeyframesWithDuration:duration/4 delay:0 options:0 animations:^{
            //End
            view.transform = CGAffineTransformMakeTranslation(-2, 0);
        } completion:^(BOOL finished) {
            [UIView animateKeyframesWithDuration:duration/4 delay:0 options:0 animations:^{
                //End
                view.transform = CGAffineTransformMakeTranslation(0, 0);
            } completion:^(BOOL finished) {
            }];
        }];
    }];
}];

Il y a deux problèmes:

  1. On devrait vraiment utiliser une animation d'images clés au lieu de nidification des animations à l'intérieur de la fin du bloc.
  2. Lors de l'utilisation de animateKeyframesWithDuration:delay:options:animations:completion: vous êtes censé appeler le addKeyframeWithRelativeStartTime:relativeDuration:animations: méthode à l'intérieur du bloc d'animation. Si vous n'appelez pas cette méthode, cette méthode va se comporter comme une norme UIView bloc d'animation.

Voir la documentation d'Apple au sujet de cette méthode ici.

J'ai donc essayé de résoudre ce problème en utilisant la méthode correctement:

view.transform = CGAffineTransformMakeTranslation(300, 0);
double frameDuration = 1.0/4.0; //4 = number of keyframes

[UIView animateKeyframesWithDuration:duration delay:delay options:0 animations:^{
    [UIView addKeyframeWithRelativeStartTime:0*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(-10, 0);
    }];
    [UIView addKeyframeWithRelativeStartTime:1*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(5, 0);
    }];
    [UIView addKeyframeWithRelativeStartTime:2*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(-2, 0);
    }];
    [UIView addKeyframeWithRelativeStartTime:3*frameDuration relativeDuration:frameDuration animations:^{
        view.transform = CGAffineTransformMakeTranslation(0, 0);
    }];
} completion:nil];

Je me sens comme à la fois les animations doivent être identiques, mais ils ne le sont pas. Qu'ai-je fait de mal dans ma tentative?

Edit: Exemple de projet (Utiliser la Commande + T pour basculer lent animations dans le simulateur)

"cependant, ils ne le sont pas." pouvez-vous développer? Comment sont-ils différents?
Je suis désolé, je dois vraiment avoir ajouté un exemple de projet que j'ai ajouté maintenant. Le calendrier des images clés ne correspondent pas. Aussi: wow, David Rönnqvist! Votre Clear* Code d'Animation post c'est la raison que j'ai posté cette question!

OriginalL'auteur iMaddin | 2014-03-12