Wie kann ich benutzerdefinierte Animationen für onOrderOut in Core Animation verwenden?

8

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:

%Vor%

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?

    
Lemming 28.10.2008, 13:23
quelle

2 Antworten

4

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.

    
tjw 16.08.2009, 18:52
quelle
0

Haben Sie überprüft, dass Ihre Methode mit key als @"onOrderOut" aufgerufen wird und dass Ihre Methode die richtige Animation zurückgibt?

    
Colin Barrett 28.10.2008 22:17
quelle