Как вы явно анимируете backgroundColor CALayer? - PullRequest
34 голосов
/ 06 февраля 2009

Я пытаюсь создать CABasicAnimation для анимации свойства backgroundColor Core Animation CALayer, но я не могу понять, как правильно обернуть значение CGColorRef для передачи в анимацию. Например:

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

, похоже, ничего не делает со свойством backgroundColor, я полагаю, потому что передача его в виде указателя, обернутого в NSValue, не способ передать его.

backgroundColor является анимируемым свойством CALayer, поэтому мой вопрос: как установить значения From или To для этого конкретного свойства (предпочтительно независимым от платформы Mac / iPhone)?

Ответы [ 2 ]

58 голосов
/ 06 февраля 2009

Вам не нужно переносить CGColorRef s при настройке toValue или fromValue свойств CABasicAnimation. Просто используйте CGColorRef. Чтобы избежать предупреждения компилятора, вы можете привести CGColorRef к id.

В моем примере приложения следующий код анимировал фон на красный.

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

Однако, когда анимация заканчивается, фон возвращается к исходному цвету. Это связано с тем, что CABasicAnimation влияет только на уровень представления целевого слоя во время работы анимации. После завершения анимации возвращается значение, установленное в слое модели. Таким образом, вам нужно будет установить свойство layer backgroundColor на красный. Возможно, отключите неявную анимацию, используя CATransaction.

Вы можете избавить себя от этой проблемы, прежде всего, используя неявную анимацию.

2 голосов
/ 11 июня 2009

Я боролся с этой проблемой, пока экспериментально не нашел контрольно-пропускной пункт. Установка свойства backgroundColor слоя непосредственно или через анимацию не будет иметь никакого эффекта, если вы измените цвет фона по умолчанию (не указан) в Интерфейсном Разработчике, в контексте курса элемента (такого как UILabel), который это был помещен в IB. Поэтому оставьте цвет фона неуказанным, и вышеприведенное должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...