Работа с CAReplicatorLayer - PullRequest
       29

Работа с CAReplicatorLayer

9 голосов
/ 28 сентября 2011

Я пытался создать крутой текстовый эффект с помощью CAReplicatorlayer, CATextLayer и очень простых анимаций. Я пытаюсь сделать так, чтобы буквы выглядели так, как будто они сбрасываются с верхней части экрана, а затем появляются крутые репликаторы, которые становятся все менее и менее заметными. Мне удалось сделать этот эффект, но не полностью.

Пока это то, что у меня есть:

CATextLayer *messageLayer = [CATextLayer layer];

[messageLayer setForegroundColor:[[UIColor blackColor] CGColor]];
[messageLayer setContentsScale:[[UIScreen mainScreen] scale]];
[messageLayer setFrame:CGRectMake(0, 0, 40, 40)];
[messageLayer setString:@"A"];


CAReplicatorLayer *replicatorX = [CAReplicatorLayer layer];

//Set the replicator's attributes
replicatorX.frame = CGRectMake(0, 0, 40, 40);
replicatorX.anchorPoint = CGPointMake(0,0);
replicatorX.position = CGPointMake(0, 0);
replicatorX.instanceCount = 9;
replicatorX.instanceDelay = 0.15;
replicatorX.instanceAlphaOffset = -0.1;

replicatorX.zPosition = 200;
replicatorX.anchorPointZ = -160;

[replicatorX addSublayer:messageLayer];

[self.view.layer addSublayer:replicatorX];


messageLayer.position = CGPointMake(40, 400);
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position.y"];
animation.fromValue = [NSNumber numberWithInt:0];;
animation.toValue = [NSNumber numberWithInt:400];
animation.duration = 3;
[messageLayer addAnimation:animation forKey:@"s"];

У меня две проблемы:

  1. Реплицированные слои начинаются в конечной точке.
  2. Когда основной слой достигает своей последней анимированной точки, анимация останавливается, и реплицированные слои не могут закончить свою анимацию.

1 Ответ

5 голосов
/ 06 октября 2012

Установка правильных значений для свойств fillMode и selectedOnCompletion объекта анимации, надеюсь, решит ваши проблемы:

"Реплицированные слои начинаются в конечной точке."

Это вызвано значением, присвоенным свойству instanceDelay, которое задерживает анимацию на 0,15 с в вашем примере.Чтобы представить анимацию из fromValue, вы должны учесть эту задержку, установив для fillMode анимации значение kCAFillModeBackwards.

animation.fillMode = kCAFillModeBackwards;

"Когда основной слой достигает своей последней анимированной точки, анимация останавливается, и анимация останавливается.реплицированные слои не могут завершить анимацию. "

Это происходит потому, что по умолчанию" анимация удаляется из анимации целевого слоя после завершения. " 1 .Вы можете переопределить это поведение по умолчанию, установив для атрибута анимации removeOnCompletion значение NO.

animation.removedOnCompletion = NO;

Надеюсь, это поможет.:)

...