CAKeyframeAnimation с использованием UIImages не работает

Я настраиваю анимацию так:

self.testAnimation = [CAKeyframeAnimation animationWithKeyPath:@"TestAnimation"];

[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c1.png"].CGImage];
[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c2.png"].CGImage];
[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c3.png"].CGImage];
[self.animationImagesAsCGImages addObject:( id )[UIImage imageNamed:@"c4.png"].CGImage];

[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.0f]];
[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.25f]];
[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.5f]];
[self.animationKeyframeTimings addObject:[NSNumber numberWithFloat:0.75f]];

self.testAnimation.values          = self.animationImagesAsCGImages;
self.testAnimation.keyTimes        = self.animationKeyframeTimings;

self.testAnimation.repeatCount     = HUGE_VALF;
self.testAnimation.autoreverses    = NO;
self.testAnimation.calculationMode = kCAAnimationDiscrete;
self.testAnimation.duration        = 2.0f;

И затем назвав это так:

[self.layer addAnimation:self.testAnimation forKey:@"TestAnimation"];

но ничего не отображается.

Я видел несколько других сообщений Stack о том, что kCAAnimationDiscrete требует, чтобы первое время было 0.0f, что, как вы можете видеть, так и есть.

Пожалуйста, порекомендуйте?


person iOSProgrammingIsFun    schedule 08.08.2012    source источник
comment
Не могли бы вы добавить свой код, где вы инициализируете значение self.testAnimation?   -  person Craig Siemens    schedule 08.08.2012
comment
Действительно? Тебе действительно нужно это увидеть?   -  person iOSProgrammingIsFun    schedule 08.08.2012


Ответы (1)


tl;dr: измените путь ключа анимации на contents, например:

self.testAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];

Почему это не работает

Когда вы пишете [CAKeyframeAnimation animationWithKeyPath:@"TestAnimation"];, вы пытаетесь анимировать свойство TestAnimation несуществующего слоя. Таким образом, любые изменения этого свойства не имеют визуального эффекта.

animationWithKeyPath: vs addAnimation:forKey:

Нередко можно упустить разницу между keyPath при создании анимации и key при добавлении анимации к слою.

При создании новой анимации вы можете указать keyPath к свойству, которое должно быть анимировано. Если вы создаете анимацию без keyPath, вы можете установить его с помощью свойства keyPath анимации.

При добавлении анимации к слою вы можете указать ключ. Этот ключ используется только для доступа к анимации с помощью метода animationForKey: в CALayer.

Как заставить это работать

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

Из документации свойства содержимого:

Объект, предоставляющий содержимое слоя. Анимация.

...

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

person David Rönnqvist    schedule 08.08.2012
comment
Спасибо. Я думал, что NSString был идентификатором анимации, а не тем, что обозначает изменяющееся свойство. - person iOSProgrammingIsFun; 08.08.2012
comment
Теперь возникла новая проблема, когда 4-е изображение (c4) не отображается... Грррр - person iOSProgrammingIsFun; 08.08.2012
comment
@iOSProgrammingIsFun Удалось ли вам отобразить 4-е изображение? У меня похожая проблема. Последнее изображение не отображается. - person DancOfDeth; 24.09.2013