Core Animation ermöglicht benutzerdefinierte Animationen durch Implementierung der actionForKey-Methode in Ihrer CALayer-basierten Klasse:
%Vor% Ich kann dann eine Animation erstellen und sie für die Aktion onOrderIn
zurückgeben (d. h. wenn die Ebene zu einer anderen Ebene hinzugefügt wird). Das funktioniert gut. Wenn ich dasselbe für onOrderOut
tue (d. H. Der Layer wird aus seinem Superlayer entfernt), wird die zurückgegebene Animation ignoriert und stattdessen die Standardanimation angewendet.
Mein Ziel ist es, den Layer in ( onOrderIn
) und out ( onOrderOut
) zu zoomen:
Das Zoomen funktioniert, das Zoomen funktioniert nicht. Stattdessen wird die Standardausblendungsanimation verwendet.
Der Code könnte einige Tippfehler enthalten, da ich diese auf einem anderen Computer tippe.
Kann jemand helfen?
Zitat von John Harper in der quartz-dev-Mailingliste :
Es gibt ein grundlegendes Problem mit Zurückgeben einer Animation für die onOrderOut Schlüssel - zu der Zeit der Animation sollte ausgeführt werden, die Ebene ist nicht mehr im Baum, also hat es keine bewirken. Also onOrderOut ist nicht nützlich zum Auslösen von Animationen; es kann sein nützlich, wenn anderer Code ausgeführt wird Ebenen werden aus dem Baum entfernt.
Die beste Lösung, die ich dafür gefunden habe (Annahme des Standardüberblendungsübergangs auf dem Elternteil ist nicht was du willst, was es oft nicht ist), benutzerdefinierte hinzuzufügen Animationen, um den Entfernungseffekt anzuwenden Sie wollen, dann, in der didStop Animationsdelegat, tatsächlich entfernen die Schicht. Es ist oft bequem zu Erstellen Sie eine einzelne Gruppe von Animationen mit der Eigenschaft delegate, und fillMode = vorwärts, removedOnCompletion = NO, damit du es kannst entferne die Ebene am Ende der Animation ohne Möglichkeit der Schicht, die noch in seiner sichtbar ist Normalzustand.
Wenn Sie viele Fälle davon machen, ist es einfach, eine gemeinsame Superklasse zu schreiben, die eine Animation startet, den Animationsdelegaten auf die Klasse setzt und + animationDidStop:
implementiert, um die Ebene ohne Animation zu entfernen. Dies stellt das Feuer und Vergessen von CoreAnimation wieder her, von dem Sie gehofft hätten, dass es mit der Standardimplementierung vorhanden wäre.
Haben Sie überprüft, dass Ihre Methode mit key
als @"onOrderOut"
aufgerufen wird und dass Ihre Methode die richtige Animation zurückgibt?
Tags und Links objective-c core-animation cocoa