2009-08-23 9 views
3

Ich habe eine so:Wie kann ein CAKeyframeAnimation den aktuellen Status übernehmen, wenn er einen anderen überschreibt?

CALayer *layer = stripeButton.layer; 
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"bounds.origin.y"]; 
moveAnim.duration = 3.35; 
moveAnim.repeatCount = 0; 
moveAnim.autoreverses = NO; 
moveAnim.removedOnCompletion = NO; 
moveAnim.calculationMode = kCAAnimationLinear; 
moveAnim.fillMode = kCAFillModeForwards; 

// ... keys and values here ... 

[theLayer addAnimation:moveAnim forKey:@"theAnimation"]; 

Sie sehen diese Animation 3,35 Sekunden geht. In der Zwischenzeit kann es vorkommen, dass bei z. B. 2 Sekunden eine neue Animation mit der gleichen Taste @ "theAnimation" für unterschiedliche Werte gestartet wird.

Problem, was passiert: Neue Animation nimmt den aktuellen sichtbaren Zustand nicht auf. Es fängt hart von vorne an. Die Ansicht springt hässlich auf die Startposition und von dort beginnt die neue Animation. Für UIView gibt es einen setAnimationsBeginFromCurrentState = YES, aber ich habe nichts Ähnliches für CAKeyFrameAnimation gefunden. Irgendeine Idee?

Antwort

4

Sie möchten den Layer nach seiner Darstellungsschicht abfragen, dh nach dem aktuellen interpolierten Status einschließlich aller derzeit laufenden Animationen.

-

Auszug aus der CALayer Klasse Referenz:

-(id)presentationLayer 

Gibt eine Kopie der Schicht enthält alle Eigenschaften, wie sie zu Beginn der aktuellen Transaktion waren, mit allen aktiven angewendet Animationen.

-

Das Verhältnis des Schichtbaumes (Daten), die Präsentation Baum (aktuelle Interpolationswerte Ihrer Daten) und der Render-Baum hier in dem CA-Programmführer erklärt.

Core Animation Rendering Architecture