Как вы явно анималируете CALayer backgroundColor?
Я пытаюсь создать CABasicAnimation для анимации свойства backgroundColor для CALayer Core Animation, но я не могу понять, как правильно обернуть значение 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 независимо)?
Ответы
Ответ 1
Вам не нужно обертывать CGColorRef
при настройке свойств 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
влияет только на уровень представления целевого слоя во время работы анимации. После окончания анимации возвращается значение, заданное в слое модели. Таким образом, вам придется установить свойства слоев backgroundColor
на красный. Возможно, отключите неявные анимации с помощью CATransaction
.
Вы могли бы сэкономить эту проблему, используя в первую очередь неявную анимацию.
Ответ 2
Я боролся с этой проблемой, пока я экспериментально не нашел контрольно-пропускной пункт. Установка свойства backgroundColor слоя, прямо или через анимацию, не будет иметь эффекта, если вы измените цвет фона по умолчанию (неопределенного) в Interface Builder в контексте курса (например, UILabel), который были помещены в IB. Поэтому оставьте цвет фона неуказанным, и выше будет работать.