Экземпляр CAReplicatorLayer игнорируется

Я пытаюсь создать несколько "карт", чтобы оживить их потом, используя этот код:

CAReplicatorLayer *cardsWrapperLayer = [CAReplicatorLayer layer];

cardsWrapperLayer.instanceCount = 4;
cardsWrapperLayer.instanceDelay = 10;
cardsWrapperLayer.instanceTransform = CATransform3DMakeTranslation(0, phoneSize.height + self.phonePadding, 0);

[cardsWrapperLayer addSublayer:self.cardLayer];

но они появляются все одновременно, даже если instanceDelay установлен в 10, У меня есть этот кусок кода в viewDidAppear метод.

2 ответа

Решение

instanceDelay ничего не делает сам по себе, он просто сдвигает "текущее время" для каждого экземпляра. Чтобы увидеть, что происходит, вам нужно добавить анимацию, например так:

CABasicAnimation *fadeIn = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeIn.fromValue = @0; // if we don’t specify a toValue, it’ll animate to the layer’s current value which by default is 1
fadeIn.duration = 0.2;
fadeIn.removedOnCompletion = NO;
[self.cardLayer addAnimation:appear forKey:@"appear"];

Обратите внимание, что removedOnCompletion важно - если вы позволите анимации удалить себя автоматически, то она исчезнет, ​​как только первый экземпляр завершит анимацию, а другие экземпляры вернутся в свое конечное состояние. Вы должны удалить анимацию вручную позже, например, когда вы знаете, что она закончится (т.е. анимация duration Layer слой репликатора instanceCount)-просто позвони -removeAnimationForKey: на базовом слое с ключом, с которым вы добавили анимацию.

Вы также должны убедиться, что вы установили анимацию на подслой слоя репликатора, а не на сам слой репликатора! Укусил меня сильно после 3 лет не работать с CAReplicatorLayer снова.

Другие вопросы по тегам