2008-10-28 3 views
8

Core Animation ermöglicht benutzerdefinierte Animationen durch die actionForKey Methode in Ihrer CALayer basierte Klasse der Umsetzung:Wie kann ich benutzerdefinierte Animationen für OnOrderOut in Core Animation verwenden?

- (id<CAAction>)actionForKey:(NSString *)key { 
    // Custom animations 
    return [super actionForKey:key]; 
} 

ich dann eine Animation erstellen und senden Sie es für die onOrderIn Aktion (dh, wenn die Schicht auf eine andere Schicht 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, die Schicht in (onOrderIn) und aus (onOrderOut) zu vergrößern:

- (id<CAAction>)actionForKey:(NSString *)key { 

    if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) { 
     CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
     a.duration = 0.25; 
     a.removedOnCompletion = NO; 
     a.fillMode = kCAFillModeBoth; 

     if ([key isEqualToString:@"onOrderIn"]) { 
      a.fromValue = [NSNumber numberWithFloat:0.0]; 
      a.toValue = [NSNumber numberWithFloat:1.0]; 
     } else { 
      a.fromValue = [NSNumber numberWithFloat:1.0]; 
      a.toValue = [NSNumber numberWithFloat:0.0]; 
     } 

     return a; 
    } 

    return [super actionForKey:key]; 
} 

Zooming in Werken, nicht der Fall ist Auszoomen. Stattdessen wird die Standardausblendungsanimation verwendet.

Der Code könnte einige Tippfehler enthalten, da ich dies auf einem anderen Computer tippe.

Kann jemand helfen?

Antwort

4

John Harper auf quartz-dev mailing list Zitiert: laufen

ein grundsätzliches Problem mit jede Animation für die onOrderOut Schlüssel von der Zeit gibt es sollte die Animation Rückkehr die Schicht ist nicht mehr im Baum Es hat also keinen Effekt. So onOrderOut ist nicht nützlich zum Auslösen von Animationen; Es kann nützlich sein, um anderen Code auszuführen, wenn Layer aus dem Baum entfernt werden.

Die beste Lösung, die ich für dieses gefunden haben (vorausgesetzt, die Standard-Fade Übergang auf dem Elternteil ist nicht das, was Sie wollen, , die es oft nicht) benutzerdefinierte Animationen hinzuzufügen, ist die Entfernungswirkung anzuwenden Sie wollen, in der didStop Animation Delegate, entfernen Sie tatsächlich die Schicht. Es ist oft bequem zu eine einzelne Gruppe von Animationen mit dem Delegierten Eigenschaftssatz erstellen und fillMode = vorwärts, removedOnCompletion = NO, so dass Sie die Schicht am Ende der ohne die Möglichkeit der Schicht Animation entfernen immer noch in seinem Normalzustand sichtbar.

Wenn Sie viele Falle dies zu tun, es ist einfach, eine gemeinsame übergeordnete Klasse zu schreiben, die eine Animation beginnt, setzt die Animation Delegierter der Klasse und Geräte + animationDidStop: die Ebene w/o Animation aktiviert 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.

+0

Ah, danke.Ich werde das testen, sollte ich es noch einmal brauchen, während wir eine komplett andere Version der Software mit Qt Jambi geschrieben haben. ;) – Lemming

0

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

+0

Ja. Im eigentlichen Code rufe ich zuerst NSLog mit dem Namen der Aktion an und in der Tat wird onOrderOut angefordert. Ich habe auch dafür gesorgt, dass die Animation erstellt und zurückgegeben wird, aber trotzdem wird sie ignoriert. – Lemming

Verwandte Themen