2009-09-04 87 views
39

我想创建一个正在下降的硬币。硬币图像是CALayer上的2个CABasicAnimations - 一个掉下来和一个旋转。当倒下的动画结束时,它停留在那里。虽然旋转动画应该是随机的,并且每次都以不同的角度结束,但它仍会弹出原始CALAyer图像。使用CABasicAnimation旋转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"]; 

回答

79

你有旋转动画的removedOnCompletion属性设置为NO,例如,

rota.removedOnCompletion = NO; 

这应该离开表示层,其中当动画完成它。默认值为YES,可以恢复为模型值,即您描述的行为。

将在fillMode也应设置,即

rota.fillMode = kCAFillModeForwards; 
+0

我做到了。我添加了我用于问题的代码。 – Mikle 2009-09-04 12:08:50

+9

fillMode的东西解决了它。天知道为什么需要:) – Mikle 2009-09-04 19:28:13

+0

@Allan任何想法为什么'fillMode'需要设置为'kCAFillModeForwards'? – pixelfreak 2011-07-26 02:44:20

1

我发现,通过设置:removedOnCompletion = NO;

没有产生仪器可见泄漏,但没有得到解除了分配,并积累了小内存量。 IDK,如果它是我的实现或者什么的,但是通过在动画结尾处添加removeAllAnimations似乎清除了这一点残留内存。

[myview.layer removeAllAnimations]; 
+0

它在模拟器或设备上吗? – Pablo 2010-11-05 00:58:04

+0

是的好点,它是在模拟器上,我没有尝试在设备上,这显然是真正的交易。这是一个非常小的增长。但是,我发现这是因为我正在使用乐器寻找另一个泄漏,并且我看到了奇怪的记忆行为。这样做可以隔离我真正的漏洞,并且我能够插入漏洞。这是xcode 3.2.4,在此之后,我确实获得了回忆,始终回到起始数字 - 这感觉很好。 – yeahdixon 2010-11-11 16:02:12

+1

您正在为表示层设置动画。然后,您应该将模型图层的'transform'属性设置为最终值,但是您应该使用'removedOnCompletion = NO'来保留表示层,从而以两层而不是一层为结尾。这就是你看到内存增加的原因。 – Jano 2012-12-13 23:01:41

4

我试图旋转箭头来回,像Twitter的/ Facebook的“拉刷新”的效果。

的问题是,我在做旋转来回在同一UIView的,因此增加

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

正向动画战争工作正常,但向后动画是不工作了。

所以我添加由yeahdixon建议的最后一行,并且除了设置视图的变换,以动画的完成状态:(180度旋转)

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

对于“恢复”动画(向后)我做到这一点的完成:

myView.transform = CGAffineTransformMakeRotation(0); 

...并能正常工作。不知何故,它不需要removeAllAnimations调用。

+0

挖掘旧的答案,但为'removeAllAnimations'事物+1。这使我的闪烁停止。 – Cyrille 2013-02-04 17:14:01