Implizite Animationen in deaktivieren - [CALayer setNeedsDisplayInRect:]
Habe ich eine Ebene mit einer komplexen Zeichnung code in seine -drawInContext: Methode. Ich bin versucht zu minimieren die Menge der Zeichnungen, die ich tun müssen, also ich bin mit -setNeedsDisplayInRect: Aktualisierung nur der geänderten Teile. Dies funktioniert prächtig. Allerdings, wenn das Grafik system-updates meine Schicht, es ist der übergang vom alten auf das neue Bild mit einem cross-fade. Ich möchte es umstellen sofort.
Ich habe versucht, mit CATransaction ausschalten, Aktionen und legen Sie die Dauer auf null, und weder die Arbeit. Hier ist der code, den ich verwende:
[CATransaction begin];
[CATransaction setDisableActions: YES];
[self setNeedsDisplayInRect: rect];
[CATransaction commit];
Gibt es eine andere Methode auf CATransaction sollte ich stattdessen verwenden (habe ich auch versucht -setValue:forKey: mit kCATransactionDisableActions, Gleiches Ergebnis).
InformationsquelleAutor der Frage Ben Gottlieb | 2010-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie tun dies, indem Sie die Aktionen Wörterbuch auf die Ebene zurück
[NSNull null]
als animation für den entsprechenden Schlüssel. Ich zum Beispiel verwendedeaktivieren der fade-in /out Animationen für das einfügen oder ändern von sub-Layern innerhalb einer meiner Schichten, sowie änderungen in der Größe und Inhalt der Ebene. Ich glaube, die
contents
Schlüssel ist, den Sie suchen, um zu verhindern, dass die überblendung auf die aktualisierte Zeichnung.InformationsquelleAutor der Antwort Brad Larson
Auch:
InformationsquelleAutor der Antwort mxcl
Wenn Sie ändern die Eigenschaft einer Ebene, CA in der Regel schafft eine implizite Transaktion-Objekt zu animieren, das zu ändern. Wenn Sie nicht wollen, zu animieren, das zu ändern, können Sie Sie deaktivieren implizite Animationen durch die Schaffung einer expliziten Transaktion und die Einstellung seiner kCATransactionDisableActions Eigenschaft wahr.
Objective-C
Swift
InformationsquelleAutor der Antwort user3378170
Neben Brad Larson ' s Antwort: für benutzerdefinierte Schichten, die (von Ihnen erstellt) können Sie Delegierung verwenden statt ändern Ebene
actions
Wörterbuch. Dieser Ansatz ist dynamischer und kann schneller. Und es ermöglicht das deaktivieren aller implizite Animationen ohne Liste alle animierbaren Tasten.Leider ist es unmöglich, zu verwenden
UIView
s als benutzerdefinierte layer-Delegierten, weil jederUIView
ist bereits ein Delegat, der seine eigene Ebene. Aber Sie können mit einem einfachen Helfer-Klasse wie folgt aus:Nutzung (innerhalb der Ansicht):
Manchmal ist es bequem zu haben, um den controller als Delegierter für die Ansicht benutzerdefinierte sub-Layer; in diesem Fall gibt es keine Notwendigkeit für eine helper-Klasse, die Sie umsetzen können
actionForLayer:forKey:
Methode direkt in den controller.Wichtiger Hinweis: versuchen Sie nicht, ändern Sie den Delegierten
UIView
's darunter liegende Ebene (z.B. zu aktivieren implizite Animationen) — schlechte Dinge, die passieren wird 🙂Hinweis: wenn Sie möchten, zu animieren (nicht deaktivieren animation) - layer neu gezeichnet wird, ist es nutzlos zu setzen
[CALayer setNeedsDisplayInRect:]
Aufruf innerhalb einerCATransaction
weil die tatsächlichen Neuzeichnen kann (und wird vermutlich) passieren manchmal auch später. Der gute Ansatz ist die Verwendung von benutzerdefinierten Eigenschaften, wie beschrieben in dieser Antwort.InformationsquelleAutor der Antwort skozin
Basiert auf Sam 's Antwort, und Simon' s Schwierigkeiten... den Delegaten hinzufügen, Referenz, nach dem erstellen der CSShapeLayer:
... anderswo in der "m" - Datei...
Im wesentlichen die gleichen wie Sam ' s, ohne die Möglichkeit zu wechseln über die benutzerdefinierte "disableImplicitAnimations" variable Anordnung. Eher ein "hard-wire" - Ansatz.
InformationsquelleAutor der Antwort bob
Eigentlich, ich finde nicht die Antworten auf die richtigen sein. Die Methode löst das problem für mich war:
Dann kannst du was Logik ist es, zu deaktivieren, eine bestimmte animation, aber da ich wollte, entfernt Sie alle, kehrte ich null.
InformationsquelleAutor der Antwort Simon
Hier eine effizientere Lösung, ähnlich akzeptierte Antwort, aber für Swift. Für einige Fälle wird es besser sein, als einer Transaktion erstellen jedes mal, wenn Sie ändern Sie den Wert, das ist eine Leistung Anliegen, wie andere erwähnt haben, z.B. die gemeinsame Nutzung-Fall zu ziehen, die Ebene position, um bei 60fps.
Finden Sie in den apple docs für wie layer-Aktionen gelöst werden. Die Umsetzung der Delegierten würde überspringen eine weitere Stufe in der Kaskade aber in meinem Fall war das zu chaotisch wegen der Nachteil die Delegierten müssen festgelegt werden, um die damit verbundenen UIView.
Edit: Aktualisiert, Dank der Kommentator wies darauf hin, dass
NSNull
entsprichtCAAction
.InformationsquelleAutor der Antwort Jarrod Smith
Fügen Sie diese zu Ihrer benutzerdefinierten Klasse, wo Sie die Umsetzung -die drawRect () - Methode. Änderungen an code, um suite Ihre Bedürfnisse für mich 'Deckkraft' hat den trick, um zu stoppen cross-fade-animation.
InformationsquelleAutor der Antwort Kamran Khan
Fand sich eine einfachere Methode zum deaktivieren der Aktion innerhalb einer
CATransaction
dass intern AnrufesetValue:forKey:
für diekCATransactionDisableActions
Schlüssel:InformationsquelleAutor der Antwort rounak
Als der iOS 7 es ist eine bequeme Methode, die genau dies:
InformationsquelleAutor der Antwort Warpling
Deaktivieren das lästige (verschwommen) animation beim Wechsel der string-Eigenschaft eines CATextLayer, können Sie dies tun:
und dann verwenden Sie es wie so ein (vergessen Sie nicht, um Ihre CATextLayer richtig, z.B. die richtige schriftart, usw.):
Können Sie sehen, meine komplette Einrichtung von CATextLayer hier:
Nun können Sie die update-caTextLayer.string, so viel wie Sie wollen =)
Inspiriert von dieseund diese Antwort.
InformationsquelleAutor der Antwort Erik Zivkovic
Versuchen.
Warnung
Wenn Sie delegieren von UITableView Instanz, manchmal Absturz.(Wahrscheinlich scrollview - hittest aufgerufen.)
InformationsquelleAutor der Antwort Tueno
Wenn Sie jemals brauchen eine sehr schnelle (aber zugegebenermaßen hacky) fix, es könnte sich lohnen, einfach tun (Swift):
InformationsquelleAutor der Antwort Martin CR
Deaktivieren, implizite layer-Animationen in Swift
InformationsquelleAutor der Antwort pawpoise