Sens de rotation avec CGAffineTransformIdentity ? [résolu]
Petite question sur les rotations :
J'ai un cercle que je fais tourner sur lui-même avec un touchesMoved.
Lorsque je lâche, il doit revenir en position initiale.
Pas de problème lorsque la rotation est inférieur à 180, il tourne dans le bon sens (sens inverse des aiguilles d'une montre) avec ce code :
Mais ensuite, (si la rotation est supérieure à 180°) il part dans l'autre sens.
Du coup j'ai essayé de le faire en deux temps en ajoutant un angle :
Mais l'animation est alors effectuée en deux temps et il y a un ralentissement au moment du changement d'animation.
Existe-il un autre moyen pour l'obliger à partir dans le sens voulu ?
J'ai un cercle que je fais tourner sur lui-même avec un touchesMoved.
Lorsque je lâche, il doit revenir en position initiale.
Pas de problème lorsque la rotation est inférieur à 180, il tourne dans le bon sens (sens inverse des aiguilles d'une montre) avec ce code :
- (void)animateCadranViewToCenter { <br />[UIView setAnimationBeginsFromCurrentState:YES];<br />[UIView beginAnimations:nil context:NULL];<br />[UIView setAnimationDuration:0.5];<br />cadran.transform = CGAffineTransformIdentity;<br />}
Mais ensuite, (si la rotation est supérieure à 180°) il part dans l'autre sens.
Du coup j'ai essayé de le faire en deux temps en ajoutant un angle :
[UIView setAnimationBeginsFromCurrentState:YES];<br />[UIView beginAnimations:nil context:NULL];<br />[UIView setAnimationDuration:0.2];<br />cadran.transform = CGAffineTransformRotate(cadran.transform, degreesToRadians(-30));<br />[UIView commitAnimations];<br />[self performSelector:@selector(animateCadranViewToCenter) withObject:nil afterDelay:0.2];
Mais l'animation est alors effectuée en deux temps et il y a un ralentissement au moment du changement d'animation.
Existe-il un autre moyen pour l'obliger à partir dans le sens voulu ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
avec arrayOfValuesOfCATransform3D une NSArray contenant des NSValue
Bon, à part que je n'arrive plus à faire défiler l'animation (la roue passe d'un état à un autre d'un coup)...
C'est que l'animation de retour (CATransform3DIdentity) est un retour sur l'animation précédente. La roue ne revient pas au point de départ.
J'avais aussi essayé de container les deux animations, mais le passage d'une animation à l'autre était aussi visible.
Mais on a déjà résolu ce problème non ?
Je suis une buse, mais j'y arrive pas.
J'ai ce code :
Mais je n'ai toujours pas d'animation
Etrangement, avec ceci :
J'ai une animation, mais le cadran reviens à la position où je l'ai lâché et non où il est parti.
... je vais chercher encore. En tous cas, merci pour la piste.
Rajoute cadran.layer.transform=rotationTransform; pour fixer l'état final.
J'ai refait un projet à zéro pour voir, mais j'ai les mêmes problèmes. Je le mets en pièce jointe au cas où...
Grâce à ton petit essai, j'ai une animation. Mais elle ne part pas au même point du lâché et arrive toujours au point du lâché.
J'aimerai que le cadran démarre au point lâché et arrive au point avant le touché.
initialAngle est l'angle par rapport à l'horizontal lors du touchesBegin.
Dès lors il ne reste plus qu'à échantillonner de currentAngle à 0 pour revenir en arrière. On peut prendre un pas régulier de quelques degrés, de toutes façons, CAKeyframeAnimation rééchantillonne ensuite selon le timer qu'il se donne. La durée de l'animation est à proportionner à la valeur de |currentAngle| . Attention currentAngle est positif ou négatif.
Lorsque currentAngle>0, un truc dans le genre quoi :
Je ne fais au maximum que 350°
Pour le reste, j'entrevois ma grande incompétence. De ma petite question d'ordre cosmétique, je me retrouve dans des méandres de codes très difficile à déchiffrer.
Je vais reprendre la doc et les posts précédents avant de te prendre plus de ton temps... encore merci Philippe
Cela doit être une question de bon dosage avec step et la durée de l'animation
Le problème est le même, il faut passer la barre des 180° et retourner dans le bon sens. Limiter à un tour ne simplifie pas.
une video de la réalisation (un peu lourde à charger)
J'ai un temps de connexion faramineux actuellement avec le site rien qu'en changeant de page . Toi aussi ?
Bon, je m'y remets >:(
C'est la rançon du succès
Bon, c'est le pétchi... mais j'en suis là (Pas taper):
J'ai l'impression que l'initialAngle n'est pas pris en compte, car même si je supprime le -initialAngle, j'ai le même comportement.
initialAngle= atan2(touch2.y - touch1.y, touch2.x - touch1.x) * 180 / M_PI;
Et puis step devrait être un CGFloat et être initialisé
J'ai rajouté la dernière ligne pour éviter que le cadran ne revienne en position où il était lâché.
Il reste à prévoir le cas currentAngle<0 , et à adapter transformAnimation.duration au nombre de tours à effectuer, que tu récupères par nStep, ou directement par |currentAngle| (auquel cas nStep est inutile)
TU peux aussi réaliser en plus un "bounce effect" à la fin de l'anim en ajoutant quelques values dans la NSArray ...
Sur le simulateur, tout va bien. Mais sur le device, j'ai un comportement bizarre avec des mouvements rapides. J'explique :
- je tourne mon cadran = OK, il suit
- je lâche = j'ai une image (très rapide) qui affiche le cadran en position de départ, puis il se remet immédiatement en position juste (où je l'ai lâché). Puis l'animation de retour se fait normalement.
Le résultat est à peine visible, mais ça perturbe l'animation.
Je penchais pour un soucis avec cadran.transform = CGAffineTransformIdentity;
Mais si je ne le mets pas, c'est une fois que toute l'animation est bien faite, que la dernière image saute sur la position où il a été lâché.
cadran.layer.transform = CATransform3DIdentity;
(j'en parle dans la conclu de mon post ici)
J'avais pas trouvé la solution (en fait j'avais aussi arrêté de chercher) mais ça va m'inciter à m'y remettre juste pour voir