Stop an auto-reverse / infinite-repeat UIView animation with a BOOL / completion block

前端 未结 4 1311
刺人心
刺人心 2021-01-01 11:06

I\'m setting up the following UIView animateWithDuration: method, with the intention of setting my animationOn BOOL elsewhere in the program to can

相关标签:
4条回答
  • 2021-01-01 11:37

    The completion block will only get called when the animation is interrupted. For example it gets called when the app goes in the background and comes back to the foreground again (via multitasking). In that case the animation is stopped. You should restart the animation when that happens.

    To stop the animation you can remove it from the view's layer:

    [button.layer removeAllAnimations];
    
    0 讨论(0)
  • 2021-01-01 11:45

    Old but another option.

    You can also setup another animation which is not repeating on the same view, that way you can also capture it in the current state and return it to how it is by using the option UIViewAnimationOptionBeginFromCurrentState. Your completion block is also called.

    -(void)someEventSoStop
    {
        button.transform = CGAffineTransformMakeScale(1.0, 1.0);
        [UIView animateWithDuration: 0.4
                              delay: 0.0
                            options: UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState
                         animations: ^{
                             button.transform = CGAffineTransformIdentity;
                         } completion: ^(BOOL finished){
    
                         }];
    }
    
    0 讨论(0)
  • 2021-01-01 11:50

    I've solved the problem by calling [button.layer removeAllAnimations].

    0 讨论(0)
  • 2021-01-01 11:52

    As per the documentation of View class reference: If you used any of the class methods such as animateWithDuration:delay:options:animations:completion: if the duration is set to negative value or 0, the changes are made without performing animation. so I did something like this to stop the infinite animation:

    [UIView animateWithDuration:0.0 animations:^{
          button.layer.affineTransform = CGAffineTransformIdentity;
      }];
    

    I think this is better than removing all animations from the layer as in the suggested answer. Note that this is applicable for all other class animation methods in the UIView class.

    0 讨论(0)
提交回复
热议问题