How to cancel UIViews block-based animation?

前端 未结 4 1493
野性不改
野性不改 2020-12-15 19:05

i currently focus the following problem:

i start an animation, where 2 objects-attributes are triggered.

the code is:

    [UIView animateWith         


        
相关标签:
4条回答
  • 2020-12-15 19:44

    If you start a new animation that takes 0.0 seconds and goes to the state you want to go to, it will cancel the old one and start the new (instant) 'animation'.

    Example for when you want to stop a moving view by going to the place it already is at:

    [UIView animateWithDuration:0.0
                          delay:0.0
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{movingView.frame = ((CALayer *)movingView.layer.presentationLayer).frame;}
                     completion:^(BOOL finished){}
     ];
    

    options:UIViewAnimationOptionBeginFromCurrentState is important. Not calling it will let your animation start at the end state of the previous animation. In movement, it would warp to the end location before warping to the place you want it to stop at. Even though your cancel-'animation' is instant, the jumping back and forth may be visible.

    Note: The animation time doesn't have to be 0.0 seconds, any animation will cancel the old one. Not entirely sure about different types of animations though. For example, I don't know if changing a frame would stop a fade.

    0 讨论(0)
  • 2020-12-15 19:46

    You can remove all the animations from the views layer

    [movingView.layer removeAllAnimations];
    
    0 讨论(0)
  • 2020-12-15 19:52

    Setting animation options UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction work for me.

    Use it like this:

    [UIView animateWithDuration:0.5
                              delay:0.0
             usingSpringWithDamping:0.7
              initialSpringVelocity:0
                            options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionAllowUserInteraction
                         animations:^{
                        // Do your stuff here, like changing the frame etc.
                        self.containerView.frame = CGRectMake(0, 100, 300, 300);
        } completion:nil];
    
    0 讨论(0)
  • 2020-12-15 19:55

    Blocks will always complete after they start, and cannot be stopped (unless you crash the app). You might want to use notification center or NSTimer to manually change frames instead.

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