2009-02-05 9 views
33

Ich versuche, eine CABasicAnimation zu erstellen, um die backgroundColor-Eigenschaft eines Core Animation CALayer zu animieren, aber ich kann nicht herausfinden, wie man einen CGColorRef-Wert richtig umwandelt, um ihn an die Animation zu übergeben. Zum Beispiel:Wie animiert man explizit die BackgroundColor eines CALayers?

CGColorSpaceRef rgbColorspace = CGColorSpaceCreateDeviceRGB(); 
CGFloat values[4] = {1.0, 0.0, 0.0, 1.0}; 
CGColorRef red = CGColorCreate(rgbColorspace, values); 
CGColorSpaceRelease(rgbColorspace); 

CABasicAnimation *selectionAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
[selectionAnimation setDuration:0.5f]; 
[selectionAnimation setToValue:[NSValue valueWithPointer:red]]; 
[layer addAnimation:selectionAnimation forKey:@"selectionAnimation"]; 

nichts auf die Eigenschaft Backgroundcolor zu tun scheint, gehe ich davon aus, weil es aus als Zeiger Gabe in einem NSValue eingewickelt ist nicht der Weg, es passieren entlang.

backgroundColor ist eine animierbare Eigenschaft von CALayer, also lautet meine Frage: Wie setzt man die From- oder To-Werte für diese spezielle Eigenschaft (vorzugsweise auf einer Mac/iPhone-unabhängigen Plattform)?

Antwort

57

Sie brauchen nicht CGColorRef s wickeln, wenn die toValue oder fromValue Eigenschaften eines CABasicAnimation einstellen. Verwenden Sie einfach die CGColorRef. Um die Compiler-Warnung zu vermeiden, können Sie die CGColorRef in eine id umwandeln.

In meiner Beispielanwendung animierte der folgende Code den Hintergrund zu rot.

CABasicAnimation* selectionAnimation = [CABasicAnimation 
    animationWithKeyPath:@"backgroundColor"]; 
selectionAnimation.toValue = (id)[UIColor redColor].CGColor; 
[self.view.layer addAnimation:selectionAnimation 
         forKey:@"selectionAnimation"]; 

Wenn die Animation jedoch beendet ist, kehrt der Hintergrund zur ursprünglichen Farbe zurück. Dies liegt daran, dass die Datei CABasicAnimation nur die Präsentationsschicht der Zielebene beeinflusst, während die Animation ausgeführt wird. Nachdem die Animation abgeschlossen ist, wird der in der Modellschicht festgelegte Wert zurückgegeben. Sie müssen also auch die Eigenschaft backgroundColor des Layers auf rot setzen. Vielleicht deaktivieren Sie die impliziten Animationen mit einem CATransaction.

Sie könnten sich diese Probleme sparen, indem Sie zuerst eine implizite Animation verwenden.

+13

Süß. Sie würden denken, dass sie die Typumwandlung dokumentieren würden, um sie irgendwo zu identifizieren. Ja, ich könnte mein Leben mit einer impliziten Animation einfacher machen, aber das nervte mich. Um dies dauerhaft zu machen, müssen Sie nur den fillMode der Animation auf kCAFillModeForwards und removeOnCompletion auf NO setzen. –

+0

+1 Schön, funktioniert wie ein Charme! –

+0

Oder Sie sparen sich viel Zeit und nutzen die Facebook Pop-Bibliothek: https://github.com/facebook/pop. Beispiele hier: https://github.com/maxmyers/FacebookPop – Benjamin

2

Ich hatte mit diesem Problem zu kämpfen, bis ich experimentell den Roadblock fand. Das Festlegen der backgroundColor-Eigenschaft des Layers, entweder direkt oder über die Animation, hat keine Auswirkungen, wenn Sie die Hintergrundfarbe im Standardkontext (oder nicht angegeben) im Interface Builder im Kontext des Kurses eines Elements (z. B. UILabel) ändern wurde in IB platziert. Lassen Sie die Hintergrundfarbe nicht angegeben und das obige sollte funktionieren.