views:

196

answers:

1

I have a UIView called activityView, which contains two subviews activityIndicator and cancelOperationsButton. These views are embedded in a XIB and wired up to my view controller.

I have two methods that deal with activating (showing) and deactivating (hiding) these two subviews:

- (void) enableActivityIndicator {
    [activityIndicator startAnimating];
    [cancelOperationsButton setHidden:NO];
}

- (void) disableActivityIndicator {
    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}

By themselves, these two methods work fine.

To give this a bit of polish, I'd like to add an animation that fades these subviews in and out:

- (void) enableActivityIndicator {
    [activityIndicator startAnimating];
    [cancelOperationsButton setHidden:NO];

    [UIView beginAnimations:@"fadeIn" context:nil];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    activityView.alpha = 1.0f;
    [UIView commitAnimations];
}

- (void) disableActivityIndicator {
    [UIView beginAnimations:@"fadeOut" context:nil];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:1.0f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    activityView.alpha = 0.0f;
    [UIView commitAnimations];

    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}

But the animations are not working — the subviews just show up or disappear without the parent view's alpha property having an effect on transparency.

How should I write these methods to get the fade-in, fade-out effect I am after?

EDIT

Here's an arrangement that works perfectly:

- (void) enableActivityIndicator {
    activityView.alpha = 0.0f;
    [activityIndicator startAnimating];
    [cancelOperationsButton setHidden:NO];

    [UIView beginAnimations:@"fadeIn" context:nil];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:0.2f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    activityView.alpha = 1.0f;
    [UIView commitAnimations];
}

- (void) disableActivityIndicator {
    [UIView beginAnimations:@"fadeOut" context:nil];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(disableActivityIndicatorComplete)];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:0.2f];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    activityView.alpha = 0.0f;
    [UIView commitAnimations];
}

- (void) disableActivityIndicatorComplete {
    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}
+3  A: 

In enable, set the view to clear before animating to opaque.

- (void) enableActivityIndicator {
    ...
    activityView.alpha = 0.0f;
    [cancelOperationsButton setHidden:NO];
    ...

In disable, do not hide the view until after the animation completes.

- (void) disableActivityIndicator {
    ...
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(hideComplete)];
    ...

- (void) hideComplete {
    [activityIndicator stopAnimating];
    [cancelOperationsButton setHidden:YES];
}
drawnonward
Perfect, cheers!
Alex Reynolds