CABasicAnimation resets to initial value after animation completes

后端 未结 15 2472
闹比i
闹比i 2020-12-04 05:44

I am rotating a CALayer and trying to stop it at its final position after animation is completed.

But after animation completes it resets to its initial position.

相关标签:
15条回答
  • 2020-12-04 06:06

    just put it inside your code

    CAAnimationGroup *theGroup = [CAAnimationGroup animation];
    
    theGroup.fillMode = kCAFillModeForwards;
    
    theGroup.removedOnCompletion = NO;
    
    0 讨论(0)
  • 2020-12-04 06:08

    Core animation maintains two layer hierarchies: the model layer and the presentation layer. When the animation is in progress, the model layer is actually intact and keeps it initial value. By default, the animation is removed once the it's completed. Then the presentation layer falls back to the value of the model layer.

    Simply setting removedOnCompletion to NO means the animation won't be removed and wastes memory. In addition, the model layer and the presentation layer won't be synchronous any more, which may lead to potential bugs.

    So it would be a better solution to update the property directly on the model layer to the final value.

    self.view.layer.opacity = 1;
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.fromValue = 0;
    animation.toValue = 1;
    [self.view.layer addAnimation:animation forKey:nil];
    

    If there's any implicit animation caused by the first line of above code, try to turn if off:

    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    self.view.layer.opacity = 1;
    [CATransaction commit];
    
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.fromValue = 0;
    animation.toValue = 1;
    [self.view.layer addAnimation:animation forKey:nil];
    
    • Reference:
      • Animations Explained by objc.io.
      • "iOS 7 Programming Pushing the Limits" by Rob Napier and Mugunth Kumar.
    0 讨论(0)
  • 2020-12-04 06:10

    Simply setting fillMode and removedOnCompletion didn't work for me. I solved the problem by setting all of the properties below to the CABasicAnimation object:

    CABasicAnimation* ba = [CABasicAnimation animationWithKeyPath:@"transform"];
    ba.duration = 0.38f;
    ba.fillMode = kCAFillModeForwards;
    ba.removedOnCompletion = NO;
    ba.autoreverses = NO;
    ba.repeatCount = 0;
    ba.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.85f, 0.85f, 1.0f)];
    [myView.layer addAnimation:ba forKey:nil];
    

    This code transforms myView to 85% of its size (3rd dimension unaltered).

    0 讨论(0)
  • 2020-12-04 06:13

    Set the following property:

    animationObject.removedOnCompletion = NO;
    
    0 讨论(0)
  • 2020-12-04 06:14

    Here's the answer, it's a combination of my answer and Krishnan's.

    cabasicanimation.fillMode = kCAFillModeForwards;
    cabasicanimation.removedOnCompletion = NO;
    

    The default value is kCAFillModeRemoved. (Which is the reset behavior you're seeing.)

    0 讨论(0)
  • 2020-12-04 06:14

    The problem with removedOnCompletion is the UI element does not allow user interaction.

    I technique is to set the FROM value in the animation and the TO value on the object. The animation will auto fill the TO value before it starts, and when it's removed will leave the object at it's correct state.

    // fade in
    CABasicAnimation *alphaAnimation = [CABasicAnimation animationWithKeyPath: @"opacity"];
    alphaAnimation.fillMode = kCAFillModeForwards;
    
    alphaAnimation.fromValue = NUM_FLOAT(0);
    self.view.layer.opacity = 1;
    
    [self.view.layer addAnimation: alphaAnimation forKey: @"fade"];
    
    0 讨论(0)
提交回复
热议问题