20

I have this code in my project:

- (void) fadeImageView {
    [UIView animateWithDuration:1.0f
                          delay:0
                        options:UIViewAnimationCurveEaseInOut
                     animations:^{
                         self.imageView.alpha = 0.0f;
                     }
                     completion:^(BOOL finished) {
                         //make the image view un-tappable.
                         //if the fade was canceled, set the alpha to 1.0
                     }];

}

however, there are circumstance where i would like to cancel this operation before the imageview has become invisible. Is there a way to cancel this animation mid animation?

Sean Danzeiser
  • 9,141
  • 12
  • 52
  • 90
  • possible duplicate of [Cancel a UIView animation?](http://stackoverflow.com/questions/554997/cancel-a-uiview-animation) Sure it's not block based, but it works. – CodaFi Aug 24 '12 at 00:19
  • 1
    Note that the proposed edit actually corrects apparently erroneous code. You should be using `UIViewAnimationOptionCurveEaseInOut` in this case. The value (0) is equivalent to `UIViewAnimationCurveEaseInOut` (0<<16) but will fail if you change it to other animation curves. – David Berry May 14 '14 at 15:05
  • possible duplicate of [How to cancel UIView block-based animation?](http://stackoverflow.com/questions/9569943/how-to-cancel-uiview-block-based-animation) – Senseful Jul 09 '15 at 14:40
  • I believe that the best way in 2018 would be to use UIViewPropertyAnimator – marczellm Nov 08 '18 at 20:43

3 Answers3

13

From Apple docs: Use of this method is discouraged in iOS 4.0 and later. Instead, you should use the animateWithDuration:delay:options:animations:completion: method to specify your animations and the animation options.:

[UIView animateWithDuration:1.f
                      delay:0
                    options:UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.imageView.alpha = 0.0f;
} completion:NULL];
Nirav Gadhiya
  • 6,342
  • 2
  • 37
  • 76
Borut Tomazin
  • 8,041
  • 11
  • 78
  • 91
  • thanks alot! that worked, whereas solution by @Thunder Rabbit didn't do it on iOS 7.1. Apple was right after all ) – user1244109 Jul 04 '14 at 10:44
11

First of all you have to add UIViewAnimationOptionAllowUserInteraction to option like..

- (void) fadeImageView {
    [UIView animateWithDuration:1.0f
                          delay:0
                        options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction
                     animations:^{
                         self.imageView.alpha = 0.0f;
                     }
                     completion:^(BOOL finished) {
                         //make the image view un-tappable.
                         //if the fade was canceled, set the alpha to 1.0
                     }];

}

and then make a method like this....

-(void)stopAnimation {
    [self.routeView.layer removeAllAnimations];
}

after that when you want to remove your animation call above method using .....

[self performSelectorOnMainThread:@selector(stopAnimation) withObject:nil waitUntilDone:YES];

Hope it will help you

Happy coding.........!!!!!!!!!!!! :)

EDIT:

Thanks user1244109 to guide me for this.

For iOS7 we have to add one more option UIViewAnimationOptionBeginFromCurrentState like:

[UIView animateWithDuration:1.0f
                              delay:0
                            options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionBeginFromCurrentState
                         animations:^{
                             self.imageView.alpha = 0.0f;
                         }
                         completion:^(BOOL finished) {
                             //make the image view un-tappable.
                             //if the fade was canceled, set the alpha to 1.0
                         }];
Nirav Gadhiya
  • 6,342
  • 2
  • 37
  • 76
  • 1
    this code worked for me on ios 7 only after specifying `UIViewAnimationOptionBeginFromCurrentState` option too. Edit it if you wish so. – user1244109 Jul 04 '14 at 11:37
8

Update: prefer this answer https://stackoverflow.com/a/21527129/194309 from Borut Tomazin

Thunder Rabbit
  • 5,405
  • 8
  • 44
  • 82