Pressing buttons when UIView is in the process of transition, flipping or shutting down

My son just discovered that he could hit my β€œFinish” button, which flipped to its previous view, once to launch the flip and one or more times when the view is in transition (switching). The second and next hits will again trigger the same action, creating some interesting results, such as the lack of visible representations, but my main UIWindow interface.

I think I should call:

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

on both representations associated with the flip transition, and then

 [coming.view setUserInteractionEnabled: YES]; 

on the final presentation after the end of the animation.

I thought it might be better than it would be somehow to globally turn off the taps, while any view was in the process of transition. What do you think?

Here is the code for switching the whole 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]; } 
+2
iphone uiviewcontroller
source share
1 answer

setUserInteractionEnabled: looks like this is the way to go. Any objections?

+1
source share

All Articles