I had similar problems with the UINavigationBar.
In one case, it was in a custom splitview (we can't use the UIKit one because there are some features missing in iOS 5.0) and also with a UINavigationController that has its view added inside another view.
The use of controller hierarchy helped a lot here, it seems iOS also pays some attention to that when deciding how to layout the UINavigationBar. I was able to have a UINavigationController with the correct height defined by the OS without having the UINavigationBar contiguous with its UIWindow’s top, so that is possible to do.
There was a problem however, when the view first appeared it had the incorrect height and then kind of automatically increased to have the correct height of 64 pixels all by itself.
The solution to get the view with the correct height from the start was to initially define the view with the whole width of the screen and then use the [UIViewController viewDidLayoutSubviews] method to define the frame of the view with the width I wanted.
This meant the controller was doing the layout of the UINavigationBar the way I wanted it to and then I would correct the frame of the view and that would not change the height of the UINavigationBar.
For the specific situation the OP presented, you can do the contrary. First define the view with half the width so the bar is small at the beginning and then change the width back to what you want. I tested this in another situation and it also worked, but it didn't had an animation, that may kill my solution. I recommend changing the width and the x position.
This is a terrible hack, so if someone comes up with a solution that will allow me to remove this code, do share.