2009-02-05 3 views
33

Je suis en train de construire une CABasicAnimation pour animer la propriété backgroundColor d'une CAL Core d'animation de base, mais je n'arrive pas à comprendre comment encapsuler correctement une valeur CGColorRef pour la transmettre à l'animation. Par exemple:Comment animer explicitement la backgroundColor d'une CALayer?

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"]; 

semble ne rien faire à la propriété backgroundColor, je suppose que la remise hors tension comme un pointeur enveloppé dans un NSValue est pas la façon de le transmettre. BackgroundColor est une propriété animable de CALayer, donc ma question est: comment définir les valeurs From ou To pour cette propriété particulière (de préférence d'une manière indépendante de la plate-forme Mac/iPhone)?

Répondre

57

Vous n'avez pas besoin d'envelopper CGColorRef s lorsque vous définissez les propriétés toValue ou fromValue d'un CABasicAnimation. Utilisez simplement le CGColorRef. Pour éviter l'avertissement du compilateur, vous pouvez convertir le CGColorRef en id.

Dans mon exemple d'application, le code suivant a animé l'arrière-plan en rouge. Cependant, lorsque l'animation est terminée, l'arrière-plan revient à la couleur d'origine. Cela est dû au fait que le CABasicAnimation affecte uniquement la couche de présentation du calque cible pendant l'exécution de l'animation. Une fois l'animation terminée, la valeur définie dans la couche du modèle est renvoyée. Donc, vous allez devoir définir la propriété couches backgroundColor en rouge aussi. Peut-être désactiver les animations implicites en utilisant un CATransaction.

Vous pourriez vous éviter ce problème en utilisant une animation implicite en premier lieu.

+13

Sweet. Vous penseriez qu'ils documenteraient le typecast à l'id quelque part. Oui, je pourrais rendre ma vie plus facile avec une animation implicite, mais ça m'embêtait. Pour que cela persiste, tout ce dont vous avez besoin est de définir le fillMode de l'animation sur kCAFillModeForwards et removedOnCompletion sur NO. –

+0

+1 Nice, fonctionne comme un charme! –

+0

Ou vous pouvez économiser du temps et utiliser la bibliothèque Facebook Pop: https://github.com/facebook/pop. Exemples ici: https://github.com/maxmyers/FacebookPop – Benjamin

2

Je luttais avec ce problème jusqu'à ce que j'ai trouvé le barrage routier expérimentalement. La définition de la propriété backgroundColor de la couche, directement ou via l'animation, n'aura aucun effet si vous modifiez la couleur d'arrière-plan par défaut (non spécifiée) dans Interface Builder, dans le contexte bien sûr d'un élément (tel que UILabel) été placé dans IB. Alors laissez la couleur de fond non spécifiée et ce qui précède devrait fonctionner.