Подтвердить что ты не робот

Как вы явно анималируете 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 независимо)?

4b9b3361

Ответ 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. Поэтому оставьте цвет фона неуказанным, и выше будет работать.