HiDuEi HiDuEi - 6 months ago 29
iOS Question

Fade In Fade Out Animation

Here is some code I struggle with for a while.

If you start the fade in animation, the label text fades in.
If I start the fade out animation the the label text fades out.

When I start the

startFade
method, only fade out is shown. How can I wait for the
fadeIn
method to finish visually before starting the
fadeOut
method.

-(IBAction)startFade:(id)sender{
[self fadeIn];
[self fadeOut];
}

-(IBAction)fadeIn:(id)sender{
[self fadeIn];
}

-(IBAction)fadeOut:(id)sender{
[self fadeOut];
}

-(void) fadeIn{
[_label setAlpha:0];
[UILabel beginAnimations:NULL context:nil];
[UILabel setAnimationDuration:2.0];
[_label setAlpha:1];
[UILabel commitAnimations];
}

-(void) fadeOut{
[UILabel beginAnimations:NULL context:nil];
[UILabel setAnimationDuration:2.0];
[_label setAlpha:0];
[UILabel commitAnimations];
}


Thanks very much
Best regards
Tim

Answer

When you call the fadeIn and fadeOut methods back to back like you're doing, the code is run instantaneously, so you'll only see animation from the last method called. UIView block based animation provides a completion handler, which seems to be exactly what you're looking for. So your code might looks something like this:

-(IBAction)startFade:(id)sender{

    [_label setAlpha:0.0f];        

    //fade in
    [UIView animateWithDuration:2.0f animations:^{

        [_label setAlpha:1.0f];

    } completion:^(BOOL finished) {

        //fade out
        [UIView animateWithDuration:2.0f animations:^{

            [_label setAlpha:0.0f];

        } completion:nil];

    }];
}