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"];
но ничего не отображается.
Я видел несколько других стековых постов о том, что kCAAnimationDiscrete требует, чтобы первое время было 0.0f, что, как вы можете видеть, так и есть.
Пожалуйста, порекомендуйте?
1 ответ
tl;dr: изменить путь к ключу анимации на contents
, как это:
self.testAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
Почему не работает
Когда ты пишешь [CAKeyframeAnimation animationWithKeyPath:@"TestAnimation"];
вы пытаетесь оживить TestAnimation
свойство на слое, который не существует. Таким образом, любые изменения этого свойства не имеют визуального эффекта.
animationWithKeyPath:
против addAnimation:forKey:
Нередко пропустить разницу между keyPath
при создании анимации и тому key
при добавлении анимации в слой.
При создании новой анимации вы можете указать keyPath для свойства, которое должно быть анимировано. Если вы создаете анимацию без keyPath, вы можете установить ее с помощью свойства keyPath анимации.
При добавлении анимации в слой вы можете указать ключ. Этот ключ используется только для доступа к анимации с использованием animationForKey: метод на CALayer.
Как заставить это работать
Поскольку вы добавляете изображения к своим значениям, я предполагаю, что вы хотите анимировать между изображениями, и в этом случае вы должны вместо этого использовать contents
свойство как ключевой путь.
Из документации на содержание собственности:
Объект, который предоставляет содержимое слоя. Animatable.
...
Вы можете установить это свойство в
CGImageRef
представить содержимое изображения вместо содержимого слоя.