Como você anima explicitamente o backgroundColor de um CALayer?

Eu estou tentando construir um CABasicAnimation para animar a propriedade backgroundColor de um Core Animation CALayer, mas não consigo descobrir como envolver corretamente um valor CGColorRef para passar para a animação. Por exemplo:

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

parece não fazer nada para a propriedade backgroundColor, eu suponho porque entregá-lo como um ponteiro envolto em um NSValue não é o caminho para passá-lo.

backgroundColor é uma propriedade animatable do CALayer, então minha pergunta é: como você define os valores De ou Para para esta propriedade específica (preferencialmente de uma maneira independente da plataforma Mac / iPhone)?

Você não precisa quebrar CGColorRef quando definir as propriedades fromValue ou fromValue de um CABasicAnimation . Basta usar o CGColorRef . Para evitar o aviso do compilador, você pode converter o CGColorRef para um id .

No meu aplicativo de amostra, o código a seguir animava o plano de fundo para vermelho.

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

No entanto, quando a animação termina, o fundo retorna à cor original. Isso ocorre porque o CABasicAnimation só afeta a camada de apresentação da camada de destino enquanto a animação está sendo executada. Depois que a animação termina, o valor definido na camada do modelo é retornado. Então você terá que configurar a propriedade backgroundColor das camadas para vermelho também. Talvez desative as animações implícitas usando uma CATransaction .

Você pode salvar esse problema usando uma animação implícita em primeiro lugar.

Eu estava lutando com esse problema até que eu experimentalmente encontrei o bloqueio. Definir a propriedade backgroundColor da camada, diretamente ou por meio da animação, não terá efeito se você alterar a cor do plano de fundo do padrão (não especificado) no Interface Builder, no contexto do curso de um item (como UILabel) que é foi colocado no IB. Então, deixe a cor de fundo não especificada e o acima deve funcionar.