iOS: un tour Complet de 360 Degrés de Rotation à l'Aide de Bloc, Pas CABasicAnimation
Il devrait être quelque chose de vraiment simple, mais je n'ai pas réussi à obtenir ce travail à l'aide de blocs. Il y a des questions et des réponses à cela, mais à tous j'ai trouvé sont résolus par l'utilisation de CABasicAnimation
et non par UIView
Bloc de Base de l'Animation, qui est ce que je suis après.
Le code suivant ne fonctionne pas (en Fonction de Bloc), pas d'animation:
CGAffineTransform spin = CGAffineTransformRotate(spiningView.transform, DEGREES_RADIANS(360));
CATransform3D identity = CATransform3DIdentity;
CATransform3D spin2 = CATransform3DRotate(identity, DEGREES_RADIANS(360), 0.0f, 0.0f, 1.0f);
[UIView animateWithDuration:3.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^
{
spiningView.transform = spin;
//spiningView.layer.transform = spin2;
//Have also tried the above, doesn't work either.
}
completion:^(BOOL finished)
{
spiningView.transform = spin;
//spiningView.layer.transform = spin2;
}];
À partir de ma compréhension, quand chaque fois que nous utilisons en Fonction de Bloc, pas d'animation, lorsque UIViewAnimation
Bloc "voit" que le commencent de la valeur est la même que la valeur finale. Juste assez, réglage de se déplacer à 360 degrés signifie que l'objet reste où il est. Mais il doit être un moyen d'utiliser le Bloc de Base de l'Animation pour faire de cette animation, car celui-ci CABasicAnimation
fonctionnerait parfaitement:
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.fromValue = [NSNumber numberWithFloat:0.0f];
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0f];
rotationAnimation.duration = 3.0f;
rotationAnimation.cumulative = YES;
rotationAnimation.repeatCount = 1;
[spiningView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
En Outre, le Bloc suivant les ouvrages, mais il y a un arrêt entre les deux animations (d'abord il pivote à 180 degrés, puis de là à en faire un autre de 180 degrés pour compléter la rotation), ce qui n'est pas ce que je suis après:
[UIView animateWithDuration:3.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^
{
spiningView.transform = CGAffineTransformRotate(spiningView.transform, DEGREES_RADIANS(180));;
}
completion:^(BOOL finished)
{
[UIView animateWithDuration:3.0f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^
{
spiningView.transform = CGAffineTransformRotate(spiningView.transform, DEGREES_RADIANS(360));
}
completion:^(BOOL finished)
{
}];
}];
Je sais que je pourrais économiser beaucoup de temps et il suffit de se rendre moi-même à l'aide de CABasicAnimation
et être fait avec elle, mais je voudrais savoir pourquoi on travaille et que l'autre n'est pas dans ce cas (faire une rotation de 360 degrés). J'espère que vous pouvez me donner une explication détaillée concernant ce entre les 2 dans ce cas, et un peu de code (Bloc) qui peut effectuer un tour complet de 360 degrés de rotation.
Merci à l'avance.
CGAffineTransformMakeRotation(M_PI*2)
dans un seul animations
bloc?Dans le deuxième bloc d'animation dans le deuxième bloc de base de la solution est en fait 360 degrés, si j'ai utilisé de 180 degrés, il suffit de faire pivoter à 180 degrés (par le premier bloc d'animation) et s'arrête là. Il semble aussi étrange pour moi que je dois mettre à 360 degrés à l'intérieur de la deuxième instruction de bloc au lieu de 180.
OriginalL'auteur Unheilig | 2013-10-16
Vous devez vous connecter pour publier un commentaire.
Avec UIView animations, Core Animation calcule le chemin le plus court entre la première transformation et la finale de la transformer. La rotation à 360° ne fonctionne pas parce que la dernière transformation est le même que la première transformation.
Pour ce que ça vaut, j'ai juste essayé le code suivant qui fait quatre 90° rotations en douceur et sans délai entre les rotations:
1. PGCD de bloquer les animations sont implicites des animations et sont vraiment pour l'animation de la vue propriétés animables, dont l'un est
view.transform
.2. Pour être honnête, je ne sais pas.
4. De ma compréhension, de votre deux-bloc approche utilise différentes transformations, et donc une image clé de la composition est déclenchée pour chaque bloc, chacun dans son propre
CATransaction
. Le deuxième bloc ne peut pas calculer ses images clés jusqu'à ce que le premier bloc est terminée, d'où le retard. Je soupçonne mon récursive, seule approche de la transformation est optimisée dans un seulCATransaction
.C'est une bonne solution, mais pourquoi quatre M_PI_2 (90 degrés) des rotations au lieu de deux M_PI (180 degré)?
OriginalL'auteur neilco
C'est quelque chose que iOS 7 de l'image clé animations sont bien adaptés. Par exemple, vous pouvez diviser une rotation complète de
view
en trois parties:Noter que lors de l'utilisation de
UIViewKeyframeAnimationOptionCalculationModePaced
vous pouvez laisser toutes les heures de début et la durée de la vierge.depuis ios 7, cela devrait être la réponse
OriginalL'auteur jawj
Ici est une version plus complète de neilco de rotateSpinningView.
Il tourne dans le sens horaire ou antihoraire. Il a un
completion:
paramètre et il démarre et s'arrête facile.OriginalL'auteur henrikberg
@neilco mettre une bonne solution mais c'est une rotation infinie.
Basé sur son code, j'ai modifier un peu pour mettre en œuvre une boucle de rotation.
}
OriginalL'auteur Ranger Way