It could be a problem with a difference between the two views. Have a look at both your views' attributes in the IB; did you specify a status bar for both? Or just one of them? This could cause a difference in vertical offset and can cause some problems I think.
You can perhaps solve this small problem by setting your two frames equal BEFORE the animation transition code:
newViewController.view.frame = self.view.frame;
(This should also then allow you to revert back to cache:YES)
On another matter, you may want to consider adding the subview onto the current window instead of the current window's current view, thus:
[[self.view superview] addSubview:newViewController.view];
This way you can remove the explicit calls to all the window events. You will also need to link the transition to your window instead of the current view otherwise animation will not work:
[UIView setAnimationTransition:transition forView:self.view.superview cache:YES];
I was struggling with similar problems, and eventually got this right. You may also want to try using QuartzCore foundation animations:
#import <QuartzCore/QuartzCore.h>
// ...
// get the view that's currently showing
UIView *currentView = self.view;
[currentView retain];
// get the the underlying UIWindow, or the view containing the current view
UIView *theWindow = [currentView superview];
UIView *newView = myNewViewController.view;
newView.frame = currentView.frame;
// add subview
[theWindow addSubview:newView];
// set up an animation for the transition between the views
CATransition *animation = [CATransition animation];
[animation setDuration:0.8];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction
functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"];
And to transition back, do the same (except in opposite direction of course) replacing your add subview with:
[self.view removeFromSuperview];
With this the previous window will come to the foreground again, but its events will not be triggered (I'm still not sure why).
I hope this sorts things out for you and helps a lot of other people.