Анимация непрозрачности CALayer
Я хочу создать анимацию CALayer, которая дает своего рода "эффектный" эффект. Для этого я пытаюсь оживить свойство "непрозрачность", но моя проблема в том, что я понятия не имею, с чего начать и как это сделать.
Вот графическое описание анимации:
opacity
| ___
1 | | |
| | | * repeatCount
0 |___| |_ . . .
-------------------------> time
|______|
duration
Прозрачность начинается с 0, затем анимируется до 1, а затем снова 0 (эта анимация от 0 до 1 к 0 занимает несколько секунд, равную длительности). Затем этот процесс повторяется "repeatCount" раз.
Вот несколько примеров кода:
float duration = ...; // 0.2 secs, 1 sec, 3 secs, etc
int repeactCount = ...; // 1, 2, 5, 6, ect
CALayer* layer = ...; // I have a CALayer from another part of the code
layer.opacity = 0;
// Animation here
done = YES; // IN THE END of the animation set this ivar to yes
Каков наилучший способ сделать это? Я никогда раньше не использовал CALayers, так что это также хорошая возможность узнать, как работает их анимационная система. Кстати, я искал документы и понимаю, как вы добавляете одну или две простые анимации, но я понятия не имею, как это сделать.
Ответы
Ответ 1
Лучший способ добиться этого - использовать явную анимацию (см. guide), создав экземпляр CABasicAnimation
и добавив его в этот слой.
Код выглядит примерно так:
CABasicAnimation *flash = [CABasicAnimation animationWithKeyPath:@"opacity"];
flash.fromValue = [NSNumber numberWithFloat:0.0];
flash.toValue = [NSNumber numberWithFloat:1.0];
flash.duration = 1.0; // 1 second
flash.autoreverses = YES; // Back
flash.repeatCount = 3; // Or whatever
[layer addAnimation:flash forKey:@"flashAnimation"];
Если вы хотите знать, когда анимация выполнена, вы можете установить делегат и реализовать метод animationDidStop:finished:
, однако лучше всего использовать блок завершения, поскольку это позволяет ко всему коду находиться в одном месте. Если вы пишете iOS 4 или OS X, вы можете использовать отличную CAAnimationBlocks категорию, чтобы выполнить это.
Ответ 2
Trojanfoe ответ отличный. Я просто хочу добавить, что если вы хотите больше контролировать "временную шкалу" (как долго это нужно, чтобы исчезнуть, как долго мы должны ждать?), Как долго это нужно, чтобы исчезнуть? И т.д.) собирается объединить несколько CABasicAnimation
в группу CAAnimationGroup.
Возможно, вы захотите прочитать мою книгу по этой теме, последняя часть которой представляет собой учебник по CAAnimation и его потомкам:
http://www.apeth.com/iOSBook/ch17.html#_core_animation
Обратите внимание, что мое обсуждение направлено на iOS; в Mac OS X, если вы там, архитектура вида/уровня немного отличается, но то, что она говорит о CAAnimation, по-прежнему правильное.