Ist es möglich, eine UIView
Animation abzubrechen, während sie ausgeführt wird? Oder müsste ich auf die CA-Ebene fallen?
dh ich habe so etwas gemacht (vielleicht auch eine Endanimationsaktion einstellen):
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve: UIViewAnimationCurveLinear];
// other animation properties
// set view properties
[UIView commitAnimations];
Aber bevor die Animation abgeschlossen ist und ich das Ereignis "Animation beendet" erhalte, möchte ich es abbrechen (abkürzen). Ist das möglich? Beim Googeln stellen einige Leute dieselbe Frage ohne Antwort - und ein oder zwei Leute spekulieren, dass dies nicht möglich ist.
ios
core-animation
uiviewanimation
philsquared
quelle
quelle
Antworten:
Ich erstelle eine neue Animation für Ihren Endpunkt. Stellen Sie eine sehr kurze Dauer ein und stellen Sie sicher, dass Sie die
+setAnimationBeginsFromCurrentState:
Methode verwenden, um vom aktuellen Status zu beginnen. Wenn Sie auf JA setzen, wird die aktuelle Animation gekürzt. Sieht ungefähr so aus:quelle
setAnimationBeginsFromCurrentState:
von iOS 4 abgeraten wird, aber es ist immer noch da und sollte immer noch funktionieren.Verwenden:
quelle
Der einfachste Weg, alle Animationen in einer bestimmten Ansicht sofort zu stoppen , ist folgender:
Verknüpfen Sie das Projekt mit QuartzCore.framework. Zu Beginn Ihres Codes:
Wenn Sie nun alle Animationen einer Ansicht stoppen möchten, die in ihren Spuren tot ist, sagen Sie Folgendes:
Die Mittellinie würde von selbst funktionieren, aber es gibt eine Verzögerung, bis der Runloop beendet ist (der "Neuzeichnungsmoment"). Um diese Verzögerung zu vermeiden, schließen Sie den Befehl wie gezeigt in einen expliziten Transaktionsblock ein. Dies funktioniert, sofern auf dieser Ebene im aktuellen Runloop keine weiteren Änderungen vorgenommen wurden.
quelle
removeAllAnimations
hat den Nebeneffekt, dass die Animation auf das endgültige Bild gebracht wird, anstatt sie dort anzuhalten, wo sie sich gerade befindet.Verwenden
UIViewAnimationOptionBeginFromCurrentState
Sie unter iOS 4 und höher die Option für die zweite Animation, um die erste Animation zu kürzen.Angenommen, Sie haben eine Ansicht mit einem Aktivitätsindikator. Sie möchten die Aktivitätsanzeige einblenden, während eine möglicherweise zeitaufwändige Aktivität beginnt, und sie ausblenden, wenn die Aktivität beendet ist. Im folgenden Code wird die Ansicht mit der Aktivitätsanzeige aufgerufen
activityView
.quelle
Um eine Animation abzubrechen, müssen Sie lediglich die Eigenschaft festlegen, die gerade animiert wird, außerhalb der UIView-Animation. Dadurch wird die Animation gestoppt, wo immer sie sich befindet, und das UIView springt zu der gerade definierten Einstellung.
quelle
-animationDidStop:finished:context:
. Wenn ja[finished boolValue] == NO
, dann wissen Sie, dass Ihre Animation irgendwie abgebrochen wurde.Es tut uns leid, diese Antwort wieder zu beleben, aber in iOS 10 haben sich die Dinge irgendwie geändert, und jetzt ist das Abbrechen möglich und Sie können sogar ordnungsgemäß abbrechen!
Nach iOS 10 können Sie Animationen mit UIViewPropertyAnimator abbrechen !
Wenn Sie true übergeben, wird die Animation abgebrochen und genau dort angehalten, wo Sie sie abgebrochen haben. Die Abschlussmethode wird nicht aufgerufen. Wenn Sie jedoch false übergeben, sind Sie für die Fertigstellung der Animation verantwortlich:
Sie können Ihre Animation beenden und im aktuellen Status (.current) bleiben oder in den Anfangszustand (.start) oder in den Endzustand (.end) wechseln.
Übrigens können Sie später sogar pausieren und neu starten ...
Hinweis: Wenn Sie kein abruptes Abbrechen wünschen, können Sie Ihre Animation umkehren oder sogar ändern, nachdem Sie sie angehalten haben!
quelle
Wenn Sie eine Einschränkung animieren, indem Sie die Konstante anstelle einer Ansichtseigenschaft ändern, funktioniert keine der anderen Methoden unter iOS 8.
Beispielanimation:
Lösung:
Sie müssen die Animationen aus den Ebenen aller Ansichten entfernen, die von der Einschränkungsänderung betroffen sind, sowie deren Unterschichten.
quelle
self.constraintView.layer.removeAllAnimations()
(Swift)Wenn Sie die Animation nur reibungslos anhalten / stoppen möchten
Quelle: So unterbrechen Sie die Animation eines Ebenenbaums
quelle
Keiner der oben genannten Punkte hat es für mich gelöst, aber das hat geholfen: Die
UIView
Animation legt die Eigenschaft sofort fest und animiert sie dann. Die Animation wird gestoppt, wenn die Präsentationsebene mit dem Modell (der Set-Eigenschaft) übereinstimmt.Ich habe mein Problem gelöst: "Ich möchte animieren, von wo aus Sie aussehen, als würden Sie erscheinen" ("Sie" bedeutet die Ansicht). Wenn Sie das wollen, dann:
CALayer * pLayer = theView.layer.presentationLayer;
Stellen Sie die Position auf die Präsentationsebene ein
Ich benutze ein paar Optionen einschließlich
UIViewAnimationOptionOverrideInheritedDuration
Da die Dokumentation von Apple jedoch vage ist, weiß ich nicht, ob sie die anderen Animationen bei der Verwendung wirklich überschreibt oder nur die Timer zurücksetzt.
Und das sollte vorerst eine anständige Lösung sein.
quelle
quelle
Schnelle Version von Stephen Darlingtons Lösung
quelle
Ich habe das gleiche Problem; Die APIs haben nichts, um eine bestimmte Animation abzubrechen. Das
+ (void)setAnimationsEnabled:(BOOL)enabled
Deaktiviert ALLE Animationen und funktioniert daher bei mir nicht. Es gibt zwei Lösungen:
1) Machen Sie Ihr animiertes Objekt zu einer Unteransicht. Wenn Sie dann die Animationen für diese Ansicht abbrechen möchten, entfernen Sie die Ansicht oder blenden Sie sie aus. Sehr einfach, aber Sie müssen die Unteransicht ohne Animationen neu erstellen, wenn Sie sie im Blick behalten möchten.
2) Wiederholen Sie die Animation nur einmal und wählen Sie einen Delegierten aus, um die Animation bei Bedarf neu zu starten:
Problem mit 2) ist, dass es immer eine Verzögerung gibt, die Animation zu stoppen, wenn der aktuelle Animationszyklus beendet ist.
Hoffe das hilft.
quelle
Auch wenn Sie die Animation wie oben beschrieben abbrechen, wird die Animation
didStopSelector
weiterhin ausgeführt. Wenn Ihre Anwendung logische Zustände enthält, die von Animationen gesteuert werden, treten Probleme auf. Aus diesem Grund verwende ich mit den oben beschriebenen Methoden die Kontextvariable vonUIView
Animationen. Wenn Sie den aktuellen Status Ihres Programms über den Kontextparameter an die Animation übergeben,didStopSelector
kann Ihre Funktion beim Stoppen der Animation entscheiden, ob sie etwas tun oder nur basierend auf dem aktuellen Status und dem als Kontext übergebenen Statuswert zurückkehren soll.quelle
quelle
So halten Sie eine Animation an, ohne den Status auf das Original oder das Finale zurückzusetzen:
quelle
Wenn ich mit
UIStackView
Animation arbeite , mussremoveAllAnimations()
ich außerdem einige Werte auf den Anfangswert setzen, daremoveAllAnimations()
sie in einen unvorhersehbaren Zustand versetzt werden können. Ich habestackView
mitview1
undview2
drinnen, und eine Ansicht sollte sichtbar und eine verborgen sein:quelle
Keine der beantworteten Lösungen hat bei mir funktioniert. Ich habe meine Probleme auf diese Weise gelöst (ich weiß nicht, ob es der richtige Weg ist?), Weil ich Probleme hatte, als ich dies zu schnell aufrief (als die vorherige Animation noch nicht fertig war). Ich übergebe meine gewünschte Animation mit dem customAnim- Block.
quelle