Cela devrait être quelque chose de vraiment simple, mais je n'ai pas réussi à faire fonctionner cela à l'aide de blocs. Il y a des questions et des réponses à cela, mais toutes les personnes que j'ai trouvées sont résolues par l'utilisation de Le code suivant ne fonctionne pas (basé sur des blocs), aucune animation: p> de ma compréhension, lorsque chaque fois que nous utilisons des blocs, pas d'animation, aucune animation Se produirait, lorsque en plus , les travaux basés sur des blocs suivants, mais il y a un arrêt entre les animations (premier, il tourne à 180 degrés, puis à partir de 180 degrés supplémentaires pour compléter la rotation), ce qui n'est pas ce que je suis après: p> < PRE> XXX PRE> Je sais que je pouvais économiser beaucoup de temps et je me rends simplement à utiliser Merci d'avance. p> p> cabasicanimation code> et non par
uiview code> Animation basée sur des blocs, qui est ce que je suis après .
uiviewanimation code> bloc "voit" que la valeur de début est identique à la valeur finale. Assez juste, le régler pour passer à 360 degrés signifierait que l'objet reste là où il se trouve. Mais il doit être un moyen d'utiliser une animation basée sur des blocs pour rendre cette animation, car la cabasicanimation code suivante> fonctionnerait parfaitement: p>
cabasicanimation en être fait avec elle, mais j'aimerais savoir Strong> pourquoi on travaille et l'autre ne fait pas partie dans ce cas (faisant une rotation de 360 degrés). J'espère que vous pouvez me donner une explication détaillée concernant celle-ci entre le 2 dans ce cas et certains CODE (basé sur des blocs) pouvant effectuer une rotation complète de 360 degrés. P>
4 Réponses :
Avec les animations UIView, l'animation de base calcule le chemin le plus court entre la transformation initiale et la transformation finale. La rotation 360 ° C ne fonctionne pas car la transformation finale est la même que la transformation initiale.
Pour ce que ça vaut la peine, je viens d'essayer le code suivant qui crée quatre rotations de 90 ° Scellement sans délai entre les rotations: p>
Ceux-ci auraient dû être une autre question vraiment comme il y a de bons points de discussion pour la discussion ouverte. Étant donné que c'est le cas, je vais garder mes réponses brèves et les structurer en tant que commentaires individuels.
1. Les animations à base de bloc GCD sont des animations implicites et sont vraiment destinées à animer les propriétés animatables de la vue, dont l'une est View.Transform code>.
2. Pour être honnête, je ne sais pas.
3. Cabasicanimation Code> est une animation explicite, pas implicite comme vous l'avez dit.
4. À ma compréhension, votre approche à deux blocs utilise différentes transformations et une composition de cadre clé est déclenchée pour chaque bloc, chacun dans son propre Catransaction code>. Le deuxième bloc ne peut pas calculer ses cadres de clé tant que le premier bloc est terminé, d'où le délai. Je soupçonne que mon approche de transformation unique récursive est optimisée dans une seule catransaction
code>.
Ceci est une solution cool, mais pourquoi quatre rotations M_PI_2 (90 degrés) au lieu de deux m_PI (180 degrés)?
Pour moi ajouter l'option uiviewanimationOptionCurveleear code> était la clé. Merci!
Voici une version plus complète de NEilco's RotaTatesPinningview.
Il tourne dans le sens des aiguilles d'une montre ou dans le sens contraire des aiguilles d'une montre. Il a un achèvement: code> paramètre et il commence et s'arrête facilement. P>
+ (void)rotateSpinningView:(UIView *)view direction:(BOOL)clockwise completion:(void (^)(BOOL finished))completion
{
int dir = clockwise ? 1 : -1;
UIViewAnimationOptions opt = UIViewAnimationOptionCurveLinear;
if (CGAffineTransformEqualToTransform(view.transform, CGAffineTransformIdentity)) {
opt = UIViewAnimationOptionCurveEaseIn;
}
else if (CGAffineTransformEqualToTransform(CGAffineTransformRotate(view.transform, dir * M_PI_2), CGAffineTransformIdentity)) {
opt = UIViewAnimationOptionCurveEaseOut;
}
[UIView animateWithDuration:0.5f delay:0.0f options:opt animations:^{
[view setTransform:CGAffineTransformRotate(view.transform, dir * M_PI_2)];
} completion:^(BOOL finished) {
if (finished && !CGAffineTransformEqualToTransform(view.transform, CGAffineTransformIdentity)) {
[self rotateSpinningView:view direction:clockwise completion:completion];
}
else if (completion && finished && CGAffineTransformEqualToTransform(view.transform, CGAffineTransformIdentity)) {
completion(finished);
}
}];
}
Il s'agit de quelque chose que les animations keyframe d'iOS 7 sont bien adaptées à. Par exemple, vous pouvez diviser une rotation complète de la vue code> en trois parties: Notez que lorsque vous utilisez uivieweyframeanimationOptionCalculationModePaçonné code> Vous pouvez laisser tout le Les heures de début et des durées vierges. p> p>
Trois pièces sont le minimum dont vous avez besoin pour faire la direction de rotation sans ambiguïté (avec deux, il pourrait aller soit dans le sens des aiguilles d'une montre, soit dans le sens des aiguilles d'une montre à chaque étape). L'animation est lisse.
Depuis iOS 7, cela devrait être la réponse
@NELILCO a mis une très bonne solution mais c'est une rotation infinie.
en fonction de son code, je modifie un peu pour mettre en œuvre une rotation d'une boucle. P>
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI) - (void)rotateSpinningView:(UIView *)spiningView stop:(BOOL)stop { [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ double rads = DEGREES_TO_RADIANS(180); if (stop) { rads = DEGREES_TO_RADIANS(360); } [spiningView setTransform:CGAffineTransformMakeRotation(rads)]; } completion:^(BOOL finished) { if (finished && !stop && !CGAffineTransformEqualToTransform(spiningView.transform, CGAffineTransformIdentity)) { [self rotateSpinningView:spiningView stop:YES]; } }];
La deuxième transformation (dans la solution à base de bloc) ne devrait-elle pas utiliser de 180 degrés, car il s'agit d'une transformation sur la propriété de transformation actuelle à ce point (qui est déjà de 180 degrés)? Vous avez également essayé simplement d'utiliser
cgaffinetransformMakerotation (m_pi * 2) code> dans un seul
Animations code> Bloc?
@Matehat dans le deuxième bloc d'animation dans la deuxième solution à base de blocs est en fait de 360 degrés, si j'avais utilisé 180 degrés, cela ferait pivoter à 180 degrés (par le premier bloc d'animation) et s'y arrête. Cela me semble également étrange que je dois définir 360 degrés dans le deuxième bloc imbriqué au lieu de 180.