You have a couple of different nasty ways you can do it. The fact that you are embedded in a UITAbBar controller actually significantly complicates this because there is no way to distinquish whether viewDidAppear: is called due to the controller being pushed or from tab swapping, meaning you may need to stash data somewhere in order to know what is causing the transition and whether you need to hide the bar or not.
Assuming you handle that, one option is to change navigationBarHidden after you have animated in. On the way out there is no good place to handle that since you want the pop animation to happen after the bar animates. The quickest solution is to hide the bar then manually run your runloop for ~0.5 seconds until it animates out then continue. Its gross but it is quick and it works.
- (void)viewWillDisappear:(BOOL)animated {
if (animated) {
[self.navigationController.navigationBar setHidden:YES animated:YES];
}
//GROSS
NSDate *endDate = [NSDate dateWithTimeIntervalSinceNow:0.5];
while([[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:endDate]);
}
If you want to do it cleanly, I recommend reimplementing UINavigationController from scratch.