【问题标题】:After rotating a CALayer using CABasicAnimation the layer jumps back to it's unrotated position使用 CABasicAnimation 旋转 CALayer 后,图层会跳回未旋转的位置
【发布时间】:2009-09-04 01:04:07
【问题描述】:

我正在尝试创建一个坠落的硬币。硬币图像是一个带有 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"];

【问题讨论】:

    标签: iphone calayer cabasicanimation


    【解决方案1】:

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

    rota.removedOnCompletion = NO;
    

    这应该将表示层留在动画完成时的位置。默认值为 YES,它将恢复为模型值,即您描述的行为。

    还应该设置fillMode,即

    rota.fillMode = kCAFillModeForwards;
    

    【讨论】:

    • fillMode 解决了它。天知道为什么需要这样:)
    • @Allan 知道为什么需要将fillMode 设置为kCAFillModeForwards
    • 您确定需要将removedOnCompletion 设置为NO 吗?当我尝试类似的事情时,将fillMode 设置为kCAFillModeForwards 似乎就足够了。
    • 10 次中有 9 次,这是错误的答案。您需要实际设置图层的属性。设置fillModeForwards 和removedOnCompletion 会产生变化的外观,但是,如果您在动画结束时查询图层,您会看到其属性仍设置为原始值。这很少(如果有的话)是你想要的:stackoverflow.com/questions/3581804/…
    • 我同意@MattLong。将removedOnCompletion 设置为NO 尤其糟糕,因为它使动画在空闲状态下运行,注定永远处于无限循环中。
    【解决方案2】:

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

    问题是,我是在同一个UIView上来回旋转,所以在添加之后

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

    前向动画战争运行正常,但后向动画根本无法运行。

    所以我添加了yeadixon建议的最后一行,另外将视图的变换设置为动画的完成状态:(旋转180度)

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

    对于“恢复”动画(向后),我在完成时执行此操作:

    myView.transform = CGAffineTransformMakeRotation(0);
    

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

    【讨论】:

    • 挖掘旧答案,但为 removeAllAnimations 的事情 +1。这让我的闪烁停止了。
    【解决方案3】:

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

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

    [myview.layer removeAllAnimations];
    

    【讨论】:

    • 是在模拟器还是设备上?
    • 是的,很好,它是在模拟器上,我没有在设备上尝试,这显然是真正的交易。这是一个非常非常小的增长。但是,我发现这是因为我正在使用仪器寻找另一个泄漏,并且我看到了奇怪的内存行为。这样做隔离了我真正的泄漏,并且我能够堵住这个洞。注意这是 xcode 3.2.4,在此之后,我确实让内存始终恢复到它的起始编号 - 这感觉很好。
    • 您正在为表示层设置动画。然后你应该将模型层的transform 属性设置为最终值,但是你用removedOnCompletion=NO 保留表示层,因此,最终得到两层而不是一层。这就是您看到内存增加的原因。
    猜你喜欢
    • 2011-12-02
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    相关资源
    最近更新 更多