Анимация непрозрачности CALayer - программирование
Подтвердить что ты не робот

Анимация непрозрачности 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, так что это также хорошая возможность узнать, как работает их анимационная система. Кстати, я искал документы и понимаю, как вы добавляете одну или две простые анимации, но я понятия не имею, как это сделать.

4b9b3361

Ответ 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, по-прежнему правильное.