2009-09-04 4 views
39

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

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

Код:

//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"]; 

ответ

79

Вы установите removedOnCompletion свойство анимации вращения до NO, например,

rota.removedOnCompletion = NO; 

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

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

rota.fillMode = kCAFillModeForwards; 
+0

я сделал. Я добавил код, который я использовал для вопроса. – Mikle

+9

вещь fillMode решила его. Бог знает, зачем это нужно :) – Mikle

+0

@Allan Любая идея, почему 'fillMode' должен быть установлен в' kCAFillModeForwards'? – pixelfreak

1

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

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

[myview.layer removeAllAnimations]; 
+0

Это на симуляторе или устройстве? – Pablo

+0

Да, хорошо, это было на симуляторе, и я не пробовал устройство, которое, очевидно, является реальной сделкой. Это было очень небольшое увеличение. BUt, я нашел эту причину, что я искал другую утечку с помощью инструментов, и я видел странное поведение памяти. Сделав это, у меня была настоящая утечка, и я смог подключить отверстие. Заметьте, это xcode 3.2.4, и после этого я получил память, чтобы последовательно вернуться к ее стартовому номеру, который чувствует себя хорошо. – yeahdixon

+1

Вы анимируете слой презентации. Затем вы должны установить свойство 'transform' слоя модели на конечное значение, но вместо этого вы сохраняете уровень представления с' removedOnCompletion = NO', таким образом, заканчивая двумя слоями вместо одного. Вот почему вы видите увеличение памяти. – Jano

4

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

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

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

Переднее анимация войны работает хорошо, но в обратном направлении анимация не работает вообще.

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

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

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

myView.transform = CGAffineTransformMakeRotation(0); 

... и он отлично работает. Так или иначе, это не требует вызова removeAllAnimations.

+0

Копаем старые ответы, но +1 для объекта 'removeAllAnimations'. Это заставило мою мерцающую остановку. – Cyrille