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:
- On devrait vraiment utiliser une animation d'images clés au lieu de nidification des animations à l'intérieur de la fin du bloc.
- Lors de l'utilisation de
animateKeyframesWithDuration:delay:options:animations:completion:
vous êtes censé appeler leaddKeyframeWithRelativeStartTime: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)
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
Vous devez vous connecter pour publier un commentaire.
tl;dr: Ils ont probablement un aspect différent parce qu'ils font des choses différentes et le résultat dans les différentes animations ajoutées à ces deux points de vue. Malheureusement, je ne sais vraiment pas comment le résoudre.
Ce qui se passe derrière la première version
Comme vous l'avez déjà dit la première version n'utilise pas l'API correctement. Il n'est pas d'ajouter des images clés à l'aide de
addKeyframeWithRelativeStartTime:relativeDuration:animations:
mais au lieu de cela modifie les propriétés directement à l'intérieur du bloc d'animation. Ensuite, il crée un nouveau "animation d'images clés" (vous verrez bientôt pourquoi j'ai utilisé les guillemets) dans la réalisation du bloc.Derrière les coulisses, ce n'est pas, en fait
CAKeyframeAnimations
(même si je ne pense pas que vous devez compter sur ce fait). C'est certains enregistrement que j'ai fait des quatre objets d'animation qui sont ajoutés à la couche derrièreview1
dans votre projet. (J'ai triché un peu et consigné l'.m41
le cadre de la transformation (qui correspond à la traduction x)).Comme vous pouvez le voir chaque animation a un
fromValue
mais nitoValue
oubyValue
. Comme vous pouvez le lire dans la documentation, ce qui signifie:Ce qui se passe derrière la deuxième version
D'autre part, la deuxième version qui ajoute correctement les images clés pour l'animation des résultats dans ce seul CAKeyframeAnimation être ajouté à la couche derrière
view2
. (Je suis toujours seul l'enregistrement de l'.m41
le cadre de la transformation)Comme vous pouvez le voir, il s'anime entre les mêmes valeurs avec la même fois, mais dans une seule animation d'images clés. Il a aussi la même durée totale et utilise la même fonction de chronométrage.
Il y a une chose que je ne suis pas la compréhension. Si je modifie le réel, animation d'images clés (à l'intérieur de mon substituée
addAnimation:forKey:
avant d'appeler super) pour définir explicitement la fonction de synchronisation dans le tableau des fonctions de temporisation, alors qu'ils font exactement la même apparence. C'est, je le fais à l'image-clé de l'animation avant il est ajouté à la couche.Cette astuce est super moche et vous devriez ne jamais les utiliser pour d'autres choses que de pur débogage!
Alors pourquoi ne ils ont l'air différent?
Bien, je crois que la réponse a à voir avec les fonctions de chronométrage tableau de l'animation avec des images clés que UIKit créé dans le second cas. C'est à peu près la seule conclusion que j'ai eu.
Cela dit, je ne sais pas si c'est un bug ou comment résoudre le problème. Je sais juste ce que le code de votre projet se fait sur la Base de l'Animation de niveau.
timingFunctions
vide. Il définittimingFunction
et c'est tout. Il n'y a pas d'API (comme d'iOS 9) sur UIKit. Pour l'instant, j'ai créé cette petite extension qui permet d'ajuster à la fois latimingFunction
ettimingFunctions
après avoir fait: github.com/salutis/View-KeyframeAnimationCurveComment avez-vous du journal de ce genre de descriptions, de l'animation? J'ai besoin de déboguer mon animation et que vous souhaitez obtenir le même résultat.
OriginalL'auteur David Rönnqvist