34 votes

Comment animez-vous explicitement le backgroundColor d'un CALayer?

Je suis en train de construire un CABasicAnimation pour animer la propriété backgroundColor d'un Core Animation CALayer, mais je ne peux pas comprendre comment bien emballer un CGColorRef valeur à transmettre à l'animation. Par exemple:

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 parce que de remettre un pointeur enveloppé dans un NSValue n'est pas la façon de le transmettre.

backgroundColor est un animables propriété de CALayer, donc ma question est: comment définissez-vous le Partir de ou Vers des valeurs pour cette propriété particulière (de préférence dans un Mac / iPhone indépendant de la plate-way)?

58voto

Jason Medeiros Points 2549

Vous n'avez pas besoin d'envelopper CGColorRefs lors du réglage de l' toValue ou fromValue propriétés d'un CABasicAnimation. Utilisez simplement l' CGColorRef. Pour éviter le message d'avertissement du compilateur, vous pouvez lancer l' CGColorRef d'un id.

Dans mon exemple d'application, le code suivant animé en arrière-plan rouge.

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

Toutefois, lorsque l'animation est terminée, l'arrière-plan renvoie à la couleur d'origine. C'est parce que l' CABasicAnimation seulement des effets de la couche de présentation de la couche cible alors que l'animation est en cours d'exécution. Une fois l'animation terminée, la valeur définie dans le modèle de la couche de retours. Vous allez donc vous devez définir les couches backgroundColor de la propriété de rouge ainsi. Peut-être désactiver l'implicite des animations à l'aide d'un CATransaction.

Vous pourriez vous épargner cette peine, par l'utilisation implicite de l'animation dans la première place.

2voto

Phil Oliver Points 69

Je me débattais avec ce problème jusqu'à ce que je trouve expérimentalement le barrage routier. La définition de la propriété backgroundColor du calque, 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. Donc, laissez la couleur de fond non spécifiée et ce qui précède devrait fonctionner.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X