I'm having difficulty getting a navigation controller to autorotate correctly. The display will autorotate on the initial view (root view controller), but it will not rotate on any new views that are pushed on. It keeps the view orientation that the initial view had when pushed.
In my App Delegate I have a navigation controller and push it's view.
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
In the root view controller I allow all orientations and I push other views onto the controller's stack.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
ParkingListController *parklc = [[ParkingListController alloc] autorelease];
[[self navigationController] pushViewController:parklc animated:YES];
I see "Yes, we should!" logged once when the new view loads, but it does not fire when the device is actually rotated.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
NSLog(@"Yes, we should!");
return YES;
}
I do not have any init overrides and the info.plist lists all four orientations.
What am I missing? Thanks!
EDIT 2011-07-07:
Strangely the map view that is pushed on when you select an item from the table view does autorotate! Why can it rotate when the table view it came from cannot?
I would suggest two things:
ensure that all of your
UIViewController
s'shouldAutorotateToInterfaceOrientation
return YES;put the log message in
willRotateToInterfaceOrientation
to verify that the views react to device rotation;shouldAutorotateToInterfaceOrientation
is a method that can be called in unpredictable ways by the framework (i.e, it is not always called when autorotating).Apart from that, it should work.
Have you ensured that shouldAutorotateToInterfaceOrientation of the ParkingListController also returns YES?
You are using a UINavigationController and it should return true for rotation. Please extend UINavigationController and use the extended class in Interface builder.
I have used this is many projects and it works.
Every view controller pushed onto the navigation controllers stack have to support the same orientations. This means that it is not possible to have some view controllers only supporting portrait and others only supporting landscape. In other words all view controllers on the same navigation controller stack should return the same in the delegate:
But there is a simple solution to this! Here is an example for going from portrait to landscape. Here is the steps to do it and below is code to support it.
First, create a new view controller (FakeRootViewController) with this code:
Here is the code to present the view controller that you wish to show in landscape mode:
Remember that the landscapeViewController should also have this implementation: