После поворота CALayer с помощью CABasicAnimation слой возвращается в исходное положение.

StackOverflow https://stackoverflow.com/questions/1376753

Вопрос

Я пытаюсь создать падающую монету.Изображение монеты представляет собой CALayer с двумя CABasicAnimations — падающей и вращающейся.Когда анимация падения подходит к концу, она остается там.Однако анимация вращения, которая должна быть случайной и каждый раз находиться под другим углом, просто возвращается к исходному изображению CALayer.

Я хочу, чтобы он оставался под тем углом, под которым закончилась анимация.Является ли это возможным?Как мне это сделать?

Код:

//Moving down animation:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
anim.duration = 1;
anim.autoreverses = NO;
anim.removedOnCompletion = YES;

anim.fromValue = [NSNumber numberWithInt: -80 - row_height * (8 - _col)];
anim.toValue = [NSNumber numberWithInt: 0];

//Rotation Animation:
CABasicAnimation *rota = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
rota.duration = 4;
rota.autoreverses = NO;
rota.removedOnCompletion = NO;
rota.fromValue = [NSNumber numberWithFloat: 0];
rota.toValue = [NSNumber numberWithFloat: 2.5 * 3.15 ];
[cl addAnimation: rota forKey: @"rotation"];
[cl addAnimation: anim forKey: @"animateFalling"];
Это было полезно?

Решение

Установлено ли для свойства RemoveOnCompletion анимации вращения значение NO, например:

rota.removedOnCompletion = NO;

Это должно оставить слой презентации там, где он был на момент завершения анимации.По умолчанию установлено значение ДА, что приведет к возврату к значению модели, то есть к описанному вами поведению.

Также должен быть установлен fillMode, т.е.

rota.fillMode = kCAFillModeForwards;

Другие советы

Я пытался вращать стрелку вперед и назад, как в Twitter/Facebook с эффектом «Потяни, чтобы обновить».

Проблема в том, что я выполнял вращение вперед и назад в одном и том же UIView, поэтому после добавления

rotation.removedOnCompletion = NO;
rotation.fillMode = kCAFillModeForwards;

Война с анимацией вперед работала нормально, а анимация назад не работала вообще.

Поэтому я добавил последнюю строку, предложенную Yeahdixon, и, кроме того, установил преобразование представления в состояние завершения анимации:(поворот на 180 градусов)

[myview.layer removeAllAnimations];
myView.transform = CGAffineTransformMakeRotation(M_PI);

Для анимации «восстановления» (назад) я делаю это по завершении:

myView.transform = CGAffineTransformMakeRotation(0);

... и все работает нормально.Почему-то ему не нужен вызов removeAllAnimations.

Я нашел это, установив: removedOnCompletion = NO;

не вызывал видимых утечек в инструментах, но не освобождался и накапливал небольшой объем памяти.ИДК, если это моя реализация или что-то в этом роде, но добавление removeAllAnimations в конце анимации, похоже, очистило этот крошечный кусочек остаточной памяти.

[myview.layer removeAllAnimations];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top