views:

418

answers:

1

My son just discovered that he could hit my view's "Done" button, which flips to the previous view, once to start the flip and one or more times as the view is in transition (flipping out). The second and next hits would trigger the same action over again, creating some interesting results, such as ending up with no views visible, but my underlying UIWindow.

I am thinking that I should call:

[coming.view setUserInteractionEnabled: NO];
[going.view setUserInteractionEnabled: NO];

on both the views involved in the flip transition, and then

[coming.view setUserInteractionEnabled: YES];

on the final view after animation has ended.

I was thinking that maybe better than this would be some way to globally disable taps while any view was in transition. What do you think?

Here is the entire view switching code:

- (void)switchTwoViews:(UIViewController *)view1 otherView:(UIViewController *)view2
{
    /*
     This method is called to switch views.
     It flips the displayed view from the main view to the flipside view and vice-versa.
     */

    UIViewController *coming = nil;
    UIViewController *going = nil;
    UIViewAnimationTransition transition;

    [view1.view setUserInteractionEnabled: NO];
    [view2.view setUserInteractionEnabled: NO];
    if (view1.view.superview == nil) {
     coming = view1;
     going = view2;
     transition = UIViewAnimationTransitionFlipFromLeft;
    }
    else {
     coming = view2;
     going = view1;
     transition = UIViewAnimationTransitionFlipFromRight;
    }
    // coming.view.frame = [UIScreen mainScreen].applicationFrame;

    // going.view.alpha = 1.0;  //uncomment these lines if we want fading of views
    // coming.view.alpha = 0.0;

    NSArray *viewArray = [[NSArray alloc] initWithObjects:coming, going, nil];
    [coming viewWillAppear:YES];
    [going viewWillDisappear:YES];
    [UIView beginAnimations:@"View Flip" context:viewArray]; {
     [UIView setAnimationDuration:1.0];
     [UIView setAnimationDelegate:self];
     [UIView setAnimationDidStopSelector:@selector(animationDidEnd:finished:context:)];
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

     //  coming.view.alpha = 1.0;  //uncomment these lines if we want fading of views
     //  going.view.alpha = 0.0;

     [UIView setAnimationTransition:transition forView:self.view cache:YES];
     [self.view addSubview: coming.view];
    }
    [UIView commitAnimations];

}

- (void) animationDidEnd:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    NSArray *viewArray = context;
    [((UIViewController *)[viewArray objectAtIndex:1]).view removeFromSuperview];
    [[viewArray objectAtIndex:1] viewDidDisappear:YES];
    [[viewArray objectAtIndex:0] viewDidAppear:YES];
    [[[viewArray objectAtIndex:0] view] setUserInteractionEnabled: YES];
    [viewArray release];
}
+1  A: 

setUserInteractionEnabled: seems to be the way to go. Any objections?

mahboudz