UIView Infini rotation de 360 degrés de l'animation?
Je suis en train de faire tourner un UIImageView
360 degrés, et nous avons examiné plusieurs tutoriels en ligne. J'ai pu obtenir aucun d'eux de travailler, sans le UIView
soit à l'arrêt ou en sautant vers une nouvelle position.
- Comment puis-je y parvenir?
La dernière chose que j'ai essayé 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'essaie de faire à peu pi (180 degrés), il fonctionne, mais si je l'appelle la méthode de nouveau, il tourne à l'envers.
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 va à 180
degrés, fait une pause pendant une fraction de seconde, puis repasse à 0
degrés avant qu'il ne commence à nouveau.
OriginalL'auteur Derek | 2012-03-23
Vous devez vous connecter pour publier un commentaire.
Trouvé une méthode (je l'ai modifié un peu) qui a fonctionné parfaitement pour moi: iphone UIImageView rotation
ajouter QuartzCore.cadre du Projet->Phases de construction->Lien Binaires
+1 pour cumulatifs. C'est la bonne façon de le faire.
C'est le bon code pour iOS 3.0 et ci-dessous, mais pour les nouveaux programmeurs et de nouveaux projets, Apple maintenant avertit les utilisateurs à l'écart de ces méthodes dans les Docs & @Nate code utilise le bloc des animations qu'Apple préfère désormais
Cela peut aider quelqu'un, [vue.couche removeAllAnimations]; pour arrêter l'animation en cas de besoin.
OriginalL'auteur Derek
Bravo à 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. La valeur par défaut pour
options
, je crois, est de vous donnerUIViewAnimationOptionCurveEaseInOut
, qui ne regarde pas droit dans une animation continue. Aussi, j'ai ajouté une case pour que je puisse arrêter mon animation à un même quart de tour si j'avais besoin (ne pas infini, mais de indéterminée durée), et la rampe d'accélération pendant les 90 premiers degrés, et à ralentir pendant les 90 derniers degrés (après un arrêt a été demandé):Mise à jour
J'ai ajouté la possibilité de gérer les demandes de commencer à tourner à nouveau (
startSpin
), tandis que le tour précédent est d'enroulement vers le bas (achèvement des travaux). Exemple de projet ici sur Github.En utilisant cela, j'ai remarqué une courte pause dans l'animation à chaque PI/2 (angle de 90 degrés) et une légère augmentation de l'utilisation du PROCESSEUR au cours de la réponse choisie à l'aide de CABasicAnimation. Le CABasicAnimation méthode produit un parfaitement lisse de l'animation.
remplacer
M_PI / 2
avec- (M_PI / 2)
. (Faire défiler le code pour le droit de voir la fin de chaque ligne)Je ne sais pas combien de temps que vous utilisez dans votre code. La même
0.5
secondes par période de 90 degrés, comme je le suis? Si oui, mon code ne les laissez pas vous arrêter à un fraction d'une rotation de 90 degrés. Il vous permet de vous arrêter à un nombre entier de 90°, mais ajoute une rotation de 90 degrés, "allégé". Ainsi, dans le code ci-dessus, si vous appelezstopSpin
après 0.35 secondes, il sera tour à un autre de 0,65 secondes, et s'arrêter au total de 180 degrés de rotation. Si vous avez des questions plus détaillées, vous devriez probablement ouvrir une nouvelle question. Se sentir libre de faire un lien vers cette réponse.De quoi êtes-vous en le voyant arriver, @MohitJethwa? J'ai une application qui utilise le présent, et il fonctionne toujours pour moi sur iOS 8.1.
OriginalL'auteur Nate
Dans Swift, vous pouvez utiliser le code suivant pour la rotation infinie:
Swift 4
Swift 3
L'arrêt est comme:
C'est une constante de clés de la Chaîne, qui permet de vous identifier et de recherche de l'animation. Il peut être n'importe quelle Chaîne de caractères. Dans le processus de suppression, vous pouvez voir que l'animation est recherché et que supprimé par cette clé.
C'est une chaîne ou quelque chose de spécifique?
Désolé pour la réponse tardive, mais oui, ça peut être n'importe quelle chaîne de caractères.
// Une touche comme dans la réponse
OriginalL'auteur Kádi
Nate réponse ci-dessus est idéal pour démarrer et arrêter l'animation et donne un meilleur contrôle. J'ai été intrigué pourquoi le vôtre ne fonctionne pas et sa ne. Je voulais partager mes découvertes ici et une version simplifiée du code qui devra animer une UIView en continu sans caler.
C'est le code que j'ai utilisé,
J'ai utilisé "CGAffineTransformRotate' au lieu de 'CGAffineTransformMakeRotation" parce que le premier renvoie le résultat est enregistré en tant que l'animation s'exécute. Cela permettra d'éviter le saut ou la réinitialisation de la vue au cours de l'animation.
Une autre chose est de ne pas utiliser 'UIViewAnimationOptionRepeat' parce qu'à la fin de l'animation avant qu'il ne commence à répéter, il réinitialise le transformer en rendant la vue à revenir à sa position d'origine. Au lieu de répéter, vous répète donc que la transformation n'est jamais remis à zéro à la valeur d'origine parce que le bloc d'animation pratiquement ne se termine jamais.
Et la dernière chose est, vous avez à transformer l'affichage par incréments de 90 degrés (M_PI /2) au lieu de 360 ou de 180 degrés (2*M_PI ou M_PI). Parce que la transformation se produit comme une multiplication de matrice de valeurs sinus et cosinus.
Donc, dire que si vous utilisez à 180 degrés sur la transformation, le cosinus de 180 rendements -1 faire de la transformation de la vue dans la direction opposée à chaque fois (Note-Nate réponse sera également avoir ce problème si vous modifiez le radian valeur de la transformation de M_PI). Une vision à 360 degrés de transformation est de simplement demander l'avis de rester où il était, par conséquent, vous ne voyez pas tout de rotation.
Oui, j'ai juste pensé que je voudrais expliquer pourquoi elle est utilisée 🙂
il peut y avoir de débordement de pile?
Mais après le réglage du point d'arrêt dans là je vois qu'il n'y aurait pas de débordement de pile, car la réalisation d'un bloc est appelé par le système, par le temps qui
rotateImageView
a déjà terminé. Il n'est donc pas vraiment récursif dans ce sens.Bonne réponse +1 pour une petite version de code avec des fonctionnalités souhaitées.
OriginalL'auteur ram
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:
Dans mon expérience, cela fonctionne parfaitement, mais assurez-vous que votre image est susceptible d'être mis en rotation autour de son centre, sans compensations, ou de l'animation d'images va "sauter" une fois il le fait autour de PI.
Pour changer la direction de la rotation, de changer le signe de
angle
(angle *= -1
).Mise à jour Commentaires par @AlexPretzlav m'a fait revoir tout cela, et j'ai réalisé que lorsque j'ai écrit ce l'image que je tournait a été mis en miroir le long de l'axe vertical et horizontal, sens l'image n'était en effet la rotation de 90 degrés, puis réinitialisation, bien qu'il regardé comme c'était de continuer à tourner dans tous les sens.
Donc, si votre image est un peu comme la mienne était, ce sera excellent travail, cependant, si l'image n'est pas symétrique, vous remarquerez le "snap" retour à l'origine de l'orientation à l'issue des 90 degrés.
Pour faire tourner un non-symétrique de l'image, vous êtes mieux avec de la accepté de répondre.
L'une de ces solutions élégantes, vu ci-dessous, pourra vraiment faire pivoter l'image, mais il y a peut être un notable de bégayer lorsque l'animation est redémarré:
Vous pourriez aussi le faire juste avec des blocs, comme @richard-j-ross-iii suggère, mais vous obtiendrez un conserver boucle d'avertissement depuis le bloc est de la capture elle-même:
Assurez-vous d'avoir
UIViewAnimationOptionRepeat
défini dans votre animationoptions
.Je l'ai fait, elle tourne de 45°, puis les boucles par saut de retour à 0° et la rotation de 45° de nouveau
Mise à jour de ma réponse à de nouvelles informations sur les raisons de ce "travaillé"
OriginalL'auteur levigroker
Ma contribution avec une rapide Extension de l'objet de la solution :
Swift 4.0
Obsolète :
.infinity
.OriginalL'auteur Kevin ABRIOUX
Utilisation quart de tour, et d'augmenter le chiffre d'progressivement.
OriginalL'auteur Richard J. Ross III
J'ai trouvé sympa de code dans cet référentiel,
Voici le code que j'ai fait des petites modifications en fonction de mon besoin de vitesse 🙂
UIImageView+Rotation.h
UIImageView+Rotation.m
Les maths, c'est comme la programmation, Vous pouvez faire la même chose avec de multiples façon. Cela ne veut pas dire que seulement 1 voie est correct et que d'autres ne le sont pas. Oui il peut y avoir certains avantages et les inconvénients de tous les sens, Mais cela ne signifie pas que vous pouvez interroger sur someones méthode de programmation, Vous pouvez suggérer des inconvénients de cette méthode et les pros de votre méthode. Ce commentaire est vraiment choquant, et vous ne devez pas ajouter de commentaire comme celui-ci.
Je suis désolé d'avoir offensé vous Dilip, mais l'écriture 2*M_PI est objectivement plus clair que ((360 * M_PI)/180), et l'écriture de ce dernier démontre un manque de compréhension de l'objet à portée de main.
Pas de soucis, mais sa bonne suggestion, j'ai mis à jour mon code. Merci.
OriginalL'auteur Dilip
Voici ma solution swift comme une UIView extension. Il pourrait être considéré comme un exercice de simulation d'un UIActivityIndicator comportement sur tout UIImageView.
OriginalL'auteur David Rysanek
C'était pour moi:
OriginalL'auteur inigo333
Un Swift3 version:
Et n'oubliez pas d'appeler
startRotate
dansviewWillAppear
pas dansviewDidLoad
.OriginalL'auteur Victor Choy
David Rysanek est génial de réponse mis à jour à Swift 4:
OriginalL'auteur Geoff H
Vous pouvez également faire le même type d'animation à l'aide de UIView et des blocs. Ici est une extension de classe de la méthode qui peut faire pivoter la vue par n'importe quel angle.
vrai, mais les deux méthodes ne font pas tout à fait la même chose...
Cette méthode (appel récursif à la fin) avec l'évolution rapide de l'animation ? Par exemple, la durée approx. 1/30s pour que je puisse modifier la vitesse de rotation de l'objet en temps réel, en réaction à la touche par exemple ?
OriginalL'auteur MiKL
Si quelqu'un voulait s'solution, mais dans swift, puis ici, c'est une ébauche de swift traduction:
OriginalL'auteur Adrian_H
pour xamarin ios:
OriginalL'auteur Danil Shaykhutdinov
C'est comment j'ai effectuer une rotation de 360 dans la bonne direction.
OriginalL'auteur Pavel
@ram réponse a été vraiment utile. Voici une Swift version de la réponse.
Que diriez-vous de mettre un drapeau? Alors, peut-être vous avez un func pour arrêter l'animation:
var stop = false
private func stopRotation() { stop = true }
Puis, à l'intérieurif finished {...}
:if finished { if stop { return} self.rotateImageView() }
Merci, j'ai fait exactement la même chose. Merci pour votre réponse.
OriginalL'auteur yoninja
Créer l'animation
L'ajouter à une vue comme
Comment est cette réponse différente? Vous aurez façon plus propre code si la plupart de vos fonctions renvoie des objets au lieu de simplement la manipulation de certains objets ici et là.
OriginalL'auteur hfossli
Swift 4.0
OriginalL'auteur Abhishek Jain
Il existe différents moyens pour effectuer des 360 degrés de l'animation avec UIView.
À L'Aide De CABasicAnimation
Voici une extension des fonctions de UIView qui gère le start & stop de rotation des opérations:
Maintenant, en utilisant, UIView.animation fermeture:
OriginalL'auteur Krunal
Je a développé une brillante animation cadre qui peut vous faire économiser ton temps!
À l'aide de cette animation peuvent être créés très facilement:
pour arrêter cette animation tout simplement mis
nil
àendlessRotater
.Si vous êtes intéressés, merci de prendre un coup d'oeil: https://github.com/hip4yes/Animatics
OriginalL'auteur Nikita Arkhipov
Swift 4,
Ref
OriginalL'auteur Zaid Pathan
Swift :
OriginalL'auteur Erhan Demirci
Swift 3 :
OriginalL'auteur Deepak Carpenter
OriginalL'auteur Warif Akhand Rishi
Je pense que vous devriez mieux ajouter un
UIVIew
Catégorie:De Mise En Œuvre De UIView (Tourner)
Pas à l'aide de cette méthode 🙂
OriginalL'auteur Zgpeace