Подтвердить что ты не робот

После поворота CALayer с использованием CABasicAnimation слой возвращается к нему в нерабочее положение

Я пытаюсь создать падающую монету. Изображение монеты - это 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"];
4b9b3361

Ответ 1

Вы установили для свойства removedOnCompletion анимации вращения значение НЕТ, например,

rota.removedOnCompletion = NO;

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

Также необходимо установить fillMode, т.е.

rota.fillMode = kCAFillModeForwards;

Ответ 2

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

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

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

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

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

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

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

myView.transform = CGAffineTransformMakeRotation(0);

... и он отлично работает. Как-то ему не нужен вызов removeAllAnimations.

Ответ 3

Я обнаружил, что, установив: removedOnCompletion = NO;

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

[myview.layer removeAllAnimations];