使用CABasicAnimation旋转CALayer后,图层会跳回到未旋转的位置

时间:2009-09-04 01:04:08

标签: iphone calayer cabasicanimation

我正在努力创造一枚落硬币。硬币图像是一个带有2个CABasicAnimations的CALayer - 一个掉落和一个旋转。当落下的动画结束时,它就会停留在那里。旋转动画虽然应该是随机的,但每次都以不同的角度结束,只会弹回原始的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 个答案:

答案 0 :(得分:79)

您是否已将旋转动画的removedOnCompletion属性设置为NO,例如

rota.removedOnCompletion = NO;

这应该使表示层离开动画结束时的位置。默认值为YES,它将回溯到模型值,即您描述的行为。

还应设置fillMode,即

rota.fillMode = kCAFillModeForwards;

答案 1 :(得分: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调用。

答案 2 :(得分:1)

我通过设置:removedOnCompletion = NO;

找到了

没有在仪器中产生可见的泄漏,但没有被解除分配,并且积累了少量的内存。 IDK,如果它是我的实现或什么,但通过在动画结束时添加removeAllAnimations似乎清除了这一点残余内存。

[myview.layer removeAllAnimations];