J'essaie de faire pivoter un UIImageView
360 degrés, et j'ai regardé plusieurs tutoriels en ligne. Je ne pouvais faire en sorte qu'aucun d'entre eux ne travaille, sans UIView
s'arrêter ni sauter dans une nouvelle position.
- Comment puis-je atteindre cet objectif?
La dernière chose que j'ai essayée est:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Mais si j'utilise 2 * pi, il ne bouge pas du tout (puisque c'est la même position). Si j'essaye de faire juste pi (180 degrés), cela fonctionne, mais si j'appelle à nouveau la méthode, elle tourne en arrière.
MODIFIER :
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
[UIView setAnimationRepeatCount:HUGE_VALF];
[UIView setAnimationBeginsFromCurrentState:YES];
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
ne fonctionne pas non plus. Il passe en 180
degrés, s'arrête une fraction de seconde, puis se réinitialise en 0
degrés avant de recommencer.
Félicitations à Richard J. Ross III pour l'idée, mais j'ai trouvé que son code n'était pas tout à fait ce dont j'avais besoin.
options
Je pense que la valeur par défaut est de vous donnerUIViewAnimationOptionCurveEaseInOut
, ce qui ne semble pas correct dans une animation continue. De plus, j'ai ajouté une vérification afin de pouvoir arrêter mon animation à un quart de tour pair si j'en avais besoin (pas infinie , mais de durée indéfinie ), et j'ai fait accélérer l'accélération pendant les 90 premiers degrés et décélérer pendant les 90 derniers degrés (après qu'un arrêt a été demandé):Mettre à jour
J'ai ajouté la possibilité de gérer les demandes pour recommencer la rotation (
startSpin
), tandis que la rotation précédente se termine (se termine). Exemple de projet ici sur Github .la source
M_PI / 2
par- (M_PI / 2)
. (Faites défiler le code vers la droite pour voir la fin de chaque ligne)0.5
secondes par 90 degrés que moi? Si c'est le cas, mon code ne vous permet pas de vous arrêter à une fraction d'une rotation de 90 degrés. Il vous permet de vous arrêter à un nombre entier d'intervalles de 90 degrés, mais ajoute une rotation supplémentaire de 90 degrés, "assouplie". Ainsi, dans le code ci-dessus, si vous appelezstopSpin
après 0,35 seconde, il tournera pendant 0,65 seconde supplémentaire et s'arrêtera à une rotation totale de 180 degrés. Si vous avez des questions plus détaillées, vous devriez probablement ouvrir une nouvelle question. N'hésitez pas à créer un lien vers cette réponse.Dans Swift, vous pouvez utiliser le code suivant pour une rotation infinie:
Swift 4
Swift 3
L'arrêt, c'est comme:
la source
La réponse de Nate ci-dessus est idéale pour arrêter et démarrer l'animation et donne un meilleur contrôle. J'ai été intrigué par le fait que le vôtre ne fonctionnait pas et les siens. Je voulais partager mes découvertes ici et une version plus simple du code qui animerait une UIView en continu sans caler.
Ceci est le code que j'ai utilisé,
J'ai utilisé «CGAffineTransformRotate» au lieu de «CGAffineTransformMakeRotation» car le premier renvoie le résultat qui est enregistré au fur et à mesure de l'animation. Cela empêchera le saut ou la réinitialisation de la vue pendant l'animation.
Une autre chose est de ne pas utiliser 'UIViewAnimationOptionRepeat' car à la fin de l'animation avant qu'elle ne commence à se répéter, elle réinitialise la transformation faisant revenir la vue à sa position d'origine. Au lieu d'une répétition, vous récursivement afin que la transformation ne soit jamais réinitialisée à la valeur d'origine car le bloc d'animation ne se termine pratiquement jamais.
Et la dernière chose est que vous devez transformer la vue par pas de 90 degrés (M_PI / 2) au lieu de 360 ou 180 degrés (2 * M_PI ou M_PI). Parce que la transformation se produit comme une multiplication matricielle des valeurs sinus et cosinus.
Par exemple, si vous utilisez une transformation à 180 degrés, le cosinus de 180 donne -1, ce qui fait que la vue se transforme dans le sens opposé à chaque fois (la réponse de Note-Nate aura également ce problème si vous changez la valeur radian de la transformation en M_PI). Une transformation à 360 degrés demande simplement à la vue de rester où elle était, donc vous ne voyez aucune rotation du tout.
la source
rotateImageView
est déjà terminé. Ce n'est donc pas vraiment récursif dans ce sens.Si tout ce que vous voulez faire est de faire pivoter l'image à l'infini, cela fonctionne très bien et est très simple:
D'après mon expérience, cela fonctionne parfaitement, mais assurez-vous que votre image est capable de pivoter autour de son centre sans aucun décalage, ou l'animation d'image "sautera" une fois qu'elle arrivera à PI.
Pour changer la direction de la rotation, changez le signe de
angle
(angle *= -1
).Mettre à jour les commentaires de @AlexPretzlav m'a fait revisiter cela, et je me suis rendu compte que lorsque j'ai écrit cela, l'image que je tournais était reflétée le long de l'axe vertical et horizontal, ce qui signifie que l'image ne tournait que de 90 degrés puis se réinitialisait, même si elle ressemblait à il continuait de tourner tout autour.
Donc, si votre image est comme la mienne, cela fonctionnera très bien, cependant, si l'image n'est pas symétrique, vous remarquerez le "snap" à son orientation d'origine après 90 degrés.
Pour faire pivoter une image non symétrique, il vaut mieux utiliser la réponse acceptée.
L'une de ces solutions moins élégantes, présentée ci-dessous, fera vraiment pivoter l'image, mais il peut y avoir un bégaiement notable au redémarrage de l'animation:
Vous pouvez également le faire uniquement avec des blocs, comme le suggère @ richard-j-ross-iii, mais vous obtiendrez un avertissement de boucle de rétention car le bloc se capture lui-même:
la source
UIViewAnimationOptionRepeat
défini votre animationoptions
.Ma contribution avec une extension Swift de la solution vérifiée:
Swift 4.0
Obsolète:
la source
.infinity
.La réponse impressionnante de David Rysanek mise à jour vers Swift 4 :
la source
Utilisez le quart de tour et augmentez le tour progressivement.
la source
Cela fonctionnait pour moi:
la source
J'ai trouvé du bon code dans ce dépôt ,
Voici le code à partir duquel j'ai fait de petits changements en fonction de mon besoin de vitesse :)
UIImageView + Rotate.h
UIImageView + Rotate.m
la source
Voici ma solution rapide en tant qu'extension UIView. Il pourrait être considéré comme une simulation d'un comportement UIActivityIndicator sur n'importe quel UIImageView.
la source
Une version Swift3:
Et rappelez - vous d'appeler
startRotate
àviewWillAppear
pasviewDidLoad
.la source
Vous pouvez également faire le même type d'animation en utilisant UIView et des blocs. Voici une méthode d'extension de classe qui peut faire pivoter la vue de n'importe quel angle.
la source
Si quelqu'un voulait la solution de Nates mais en rapide, voici une traduction rapide et approximative:
la source
pour xamarin ios:
la source
C'est ainsi que je fais pivoter 360 ° dans la bonne direction.
la source
Créer l'animation
Ajoutez-le à une vue comme celle-ci
En quoi cette réponse est-elle différente? Vous aurez un code beaucoup plus propre si la plupart de vos fonctions retournent des objets au lieu de simplement manipuler certains objets ici et là.
la source
Il existe différentes façons d'effectuer une animation à 360 degrés avec UIView.
Utilisation de CABasicAnimation
Voici une fonction d'extension pour UIView qui gère les opérations de rotation de démarrage et d'arrêt:
Maintenant en utilisant, fermeture UIView.animation :
la source
La réponse de @ ram a été très utile. Voici une version Swift de la réponse.
Swift 2
Swift 3,4,5
la source
var stop = false
private func stopRotation() { stop = true }
Ensuite, à l'intérieurif finished {...}
:if finished { if stop { return} self.rotateImageView() }
J'ai développé un cadre d'animation brillant qui peut vous faire gagner du temps! En l'utilisant, cette animation peut être créée très facilement:
pour arrêter cette animation, définissez simplement
nil
surendlessRotater
.Si vous êtes intéressé, jetez un œil: https://github.com/hip4yes/Animatics
la source
Swift 4 ,
Réf.
la source
Swift 4.0
la source
Extension Swift 5 UIView à l'aide d'animations d'images clés
Cette approche nous permet d'utiliser directement UIView.AnimationOptions.repeat
la source
Rapide :
la source
Swift 3:
la source
la source
Je pense que vous devriez mieux ajouter une
UIVIew
catégorie:Implémentation UIView (Rotation)
Ne pas utiliser ces méthodes :)
la source