Ich versuche, mich um UIImageView
360 Grad zu drehen , und habe mir online mehrere Tutorials angesehen. Ich konnte keinen von ihnen zum Laufen bringen, ohne UIView
anzuhalten oder in eine neue Position zu springen.
- Wie kann ich das erreichen?
Das Letzte, was ich versucht habe, ist:
[UIView animateWithDuration:1.0
delay:0.0
options:0
animations:^{
imageToMove.transform = CGAffineTransformMakeRotation(M_PI);
}
completion:^(BOOL finished){
NSLog(@"Done!");
}];
Aber wenn ich 2 * pi benutze, bewegt es sich überhaupt nicht (da es die gleiche Position ist). Wenn ich versuche, nur pi (180 Grad) zu machen, funktioniert es, aber wenn ich die Methode erneut aufrufe, dreht sie sich rückwärts.
EDIT :
[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!");
}];
funktioniert auch nicht. Es geht zu 180
Grad, pausiert für den Bruchteil einer Sekunde und wird dann auf 0
Grad zurückgesetzt, bevor es erneut beginnt.
Ein großes Lob an Richard J. Ross III für die Idee, aber ich fand, dass sein Code nicht ganz das war, was ich brauchte.
options
Ich glaube, die Standardeinstellung für ist, Ihnen zu gebenUIViewAnimationOptionCurveEaseInOut
, was in einer fortlaufenden Animation nicht richtig aussieht. Außerdem habe ich eine Überprüfung hinzugefügt, damit ich meine Animation bei Bedarf um eine gleichmäßige Vierteldrehung stoppen kann (nicht unendlich , aber von unbestimmter Dauer), und die Beschleunigung in den ersten 90 Grad ansteigen und in den letzten 90 Grad verlangsamen lassen (nachdem ein Stopp angefordert wurde):Aktualisieren
Ich habe die Möglichkeit hinzugefügt, Anforderungen zu verarbeiten, um erneut mit dem Drehen zu beginnen (
startSpin
), während der vorherige Dreh beendet wird (abgeschlossen). Beispielprojekt hier auf Github .quelle
M_PI / 2
durch- (M_PI / 2)
. (Scrollen Sie den Code nach rechts, um das Ende jeder Zeile zu sehen.)0.5
Sekunden pro 90 Grad wie ich? Wenn ja, können Sie mit meinem Code nicht bei einem Bruchteil einer 90-Grad-Drehung anhalten . Sie können in einer ganzen Reihe von 90-Grad-Intervallen anhalten, aber eine zusätzliche 90-Grad-Drehung hinzufügen, die "erleichtert" wird. Wenn Sie im obigen CodestopSpin
nach 0,35 Sekunden aufrufen , dreht es sich für weitere 0,65 Sekunden und stoppt bei einer Gesamtdrehung von 180 Grad. Wenn Sie detailliertere Fragen haben, sollten Sie wahrscheinlich eine neue Frage öffnen. Fühlen Sie sich frei, auf diese Antwort zu verlinken.In Swift können Sie den folgenden Code für die unendliche Rotation verwenden:
Swift 4
Swift 3
Anhalten ist wie:
quelle
Die obige Antwort von Nate ist ideal zum Stoppen und Starten von Animationen und bietet eine bessere Kontrolle. Ich war fasziniert, warum deine nicht funktioniert hat und seine. Ich wollte meine Erkenntnisse hier und eine einfachere Version des Codes teilen, die eine UIView kontinuierlich animieren würde, ohne zu blockieren.
Dies ist der Code, den ich verwendet habe,
Ich habe 'CGAffineTransformRotate' anstelle von 'CGAffineTransformMakeRotation' verwendet, da erstere das Ergebnis zurückgibt, das im Verlauf der Animation gespeichert wird. Dies verhindert das Springen oder Zurücksetzen der Ansicht während der Animation.
Eine andere Sache ist, 'UIViewAnimationOptionRepeat' nicht zu verwenden, da am Ende der Animation, bevor sie sich zu wiederholen beginnt, die Transformation zurückgesetzt wird, wodurch die Ansicht an ihre ursprüngliche Position zurückspringt. Anstelle einer Wiederholung rekursieren Sie, sodass die Transformation niemals auf den ursprünglichen Wert zurückgesetzt wird, da der Animationsblock praktisch nie endet.
Und das Letzte ist, dass Sie die Ansicht in Schritten von 90 Grad (M_PI / 2) anstelle von 360 oder 180 Grad (2 * M_PI oder M_PI) transformieren müssen. Weil die Transformation als Matrixmultiplikation von Sinus- und Cosinuswerten erfolgt.
Wenn Sie also eine 180-Grad-Transformation verwenden, ergibt der Cosinus von 180 -1, wodurch die Ansicht jedes Mal in die entgegengesetzte Richtung transformiert wird (die Antwort von Note-Nate hat auch dieses Problem, wenn Sie den Bogenmaßwert der Transformation in M_PI ändern). Bei einer 360-Grad-Transformation wird lediglich die Ansicht aufgefordert, dort zu bleiben, wo sie war. Daher sehen Sie überhaupt keine Drehung.
quelle
rotateImageView
bereits fertig ist. In diesem Sinne ist es also nicht wirklich rekursiv.Wenn Sie das Bild nur endlos drehen möchten, funktioniert dies recht gut und ist sehr einfach:
Nach meiner Erfahrung funktioniert dies einwandfrei, aber stellen Sie sicher, dass Ihr Bild ohne Offsets um seine Mitte gedreht werden kann, da die Bildanimation sonst "springt", sobald es zu PI gelangt.
Um die Drehrichtung zu ändern, ändern Sie das Vorzeichen von
angle
(angle *= -1
).Update Kommentare von @AlexPretzlav hat mich dies erneut, und ich erkannte , dass , wenn ich schrieb dies das Bild , das ich wurde sowohl gespiegelt rotierte entlang der vertikalen und horizontalen Achse wurde das Bild bedeutet in der Tat nur Drehen um 90 Grad und Zurücksetzen dann, wenn es aussah wie es drehte sich weiter umher.
Wenn Ihr Bild so ist wie meins, funktioniert dies hervorragend. Wenn das Bild jedoch nicht symmetrisch ist, werden Sie feststellen, dass nach 90 Grad wieder in die ursprüngliche Ausrichtung zurückgekehrt ist.
Um ein nicht symmetrisches Bild zu drehen, ist die akzeptierte Antwort besser geeignet.
Eine dieser weniger eleganten Lösungen (siehe unten) dreht das Bild wirklich, aber beim Neustart der Animation kann es zu einem merklichen Ruckeln kommen:
Sie können dies auch nur mit Blöcken tun, wie @ richard-j-ross-iii vorschlägt, aber Sie erhalten eine Retain-Loop-Warnung, da der Block sich selbst erfasst:
quelle
UIViewAnimationOptionRepeat
Ihre Animation eingestellt habenoptions
.Mein Beitrag mit einer Swift-Erweiterung aus der geprüften Lösung:
Swift 4.0
Veraltet:
quelle
.infinity
.David Rysaneks großartige Antwort wurde auf Swift 4 aktualisiert :
quelle
Verwenden Sie eine Vierteldrehung und erhöhen Sie die Drehung schrittweise.
quelle
Das hat bei mir funktioniert:
quelle
Ich habe schönen Code in diesem Repository gefunden ,
Hier ist der Code davon Ich habe kleine Änderungen vorgenommen, je nach meinem Bedürfnis nach Geschwindigkeit :)
UIImageView + Rotate.h
UIImageView + Rotate.m
quelle
Hier ist meine schnelle Lösung als UIView-Erweiterung. Dies kann als Simulation eines UIActivityIndicator-Verhaltens in einem beliebigen UIImageView betrachtet werden.
quelle
Eine Swift3-Version:
Und denken Sie daran nennen
startRotate
inviewWillAppear
in nichtviewDidLoad
.quelle
Sie können dieselbe Art von Animation auch mit UIView und Blöcken ausführen. Hier ist eine Klassenerweiterungsmethode, mit der die Ansicht um einen beliebigen Winkel gedreht werden kann.
quelle
Wenn jemand die Lösung von Nates wollte, aber schnell, dann ist hier eine grobe schnelle Übersetzung:
quelle
für Xamarin ios:
quelle
So drehe ich 360 in die richtige Richtung.
quelle
Erstellen Sie die Animation
Fügen Sie es einer solchen Ansicht hinzu
Wie unterscheidet sich diese Antwort? Sie werden viel saubereren Code haben, wenn die meisten Ihrer Funktionen Objekte zurückgeben, anstatt nur einige Objekte hier und da zu manipulieren.
quelle
Es gibt verschiedene Möglichkeiten, eine 360-Grad-Animation mit UIView durchzuführen.
Verwenden von CABasicAnimation
Hier ist eine Erweiterungsfunktion für UIView, die Start- und Stopp-Rotationsvorgänge verarbeitet:
Jetzt mit UIView.animation Closure:
quelle
Die Antwort von @ ram war wirklich hilfreich. Hier ist eine Swift-Version der Antwort.
Swift 2
Swift 3,4,5
quelle
var stop = false
private func stopRotation() { stop = true }
Dann drinnenif finished {...}
:if finished { if stop { return} self.rotateImageView() }
Ich habe ein glänzendes Animations-Framework entwickelt, mit dem Sie Zeit sparen können! Mit dieser Animation kann sehr einfach erstellt werden:
Um diese Animation zu stoppen, setzen Sie einfach
nil
aufendlessRotater
.Wenn Sie interessiert sind, schauen Sie bitte: https://github.com/hip4yes/Animatics
quelle
Swift 4 ,
Ref
quelle
Swift 4.0
quelle
Swift 5 UIView-Erweiterung mit Keyframe-Animationen
Dieser Ansatz ermöglicht es uns, die UIView.AnimationOptions.repeat direkt zu verwenden
quelle
Swift:
quelle
Swift 3:
quelle
quelle
Ich denke, Sie sollten besser eine
UIVIew
Kategorie hinzufügen :Implementierung UIView (Drehen)
Nicht mit diesen Methoden :)
quelle