Вопрос по cabasicanimation, iphone, calayer – После поворота CALayer с использованием CABasicAnimation слой возвращается в исходное положение

39

Я пытаюсь создать падающую монету. Изображение монеты - это CALayer с 2 анимациями CABasic на нем - падающим и вращающимся. Когда анимация падения падает до конца, она остается там. Анимация поворота, которая должна быть случайной и каждый раз заканчиваться под другим углом, просто возвращается к исходному изображению 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"];

Ваш Ответ

3   ответа
4

как Twitter / Facebook "Потяните, чтобы обновить " эффект.

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

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

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

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

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

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

myView.transform = CGAffineTransformMakeRotation(0);

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

Копаем старые ответы, но +1 заremoveAllAnimations вещь. Это заставило меня остановиться. Cyrille
79

ие NO, например,

rota.removedOnCompletion = NO;

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

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

rota.fillMode = kCAFillModeForwards;
Я согласен с @MattLong. настройкаremovedOnCompletion вNO Это особенно плохо, потому что он держит анимацию в бездействующем состоянии, навсегда обреченной на бесконечный цикл. zakdances
Я сделал. Я добавил код, который использовал в вопросе. Mikle
@Allan Любая идея, почемуfillMode должен быть установлен в?kCAFillModeForwards pixelfreak
Вы уверены, что этонеобходимо установитьremovedOnCompletion вNO? Когда я пробовал что-то подобное, настройкаfillMode вkCAFillModeForwards оказалось достаточно. alastair
1

removedOnCompletion = NO;

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

[myview.layer removeAllAnimations];
Это на симуляторе или устройстве? Pablo
Вы анимируете слой презентации. Тогда вы должны установитьtransform свойство слоя модели до конечного значения, но вместо этого вы сохраняете слой представления сremovedOnCompletion=NOтаким образом, заканчивая двумя слоями вместо одного. Тот'почему вы видите увеличение памяти. Jano
да, хороший момент, это было на симуляторе, и я не пробовал на устройстве, что, очевидно, является реальной сделкой. Это было очень очень небольшое увеличение. Но я нашел эту причину, потому что я искал другую утечку, используя инструменты, и я видел странное поведение памяти. Выполнение этого изолировало истинную утечку, которую я имел, и я смог закрыть дыру. Обратите внимание, что это xcode 3.2.4, и после этого я получил память, чтобы последовательно возвращаться к своему начальному номеру - что приятно. yeahdixon

Похожие вопросы