I have a similar problem.
I have a game working in landscape orientation (both left and right landscape).
In order to manage a multi-view application I use a root UIviewController, i.e. a dummy UIViewcontroller with a UIview that does nothing. I then add every other UIview to it as a subview.
When starting the app, the emulator quickly rotates to a portrait orientation, and i get every one of my views with it's frame property looking like (0,-80,320,480). This results in the view being clipped by a 160 X 320 rectangle on the right side.
I've noticed that the – shouldAutorotateToInterfaceOrientation: method of each subview is only called once, and that happens when it is added to the root view. Later on, when rotating the device, only the root view gets it's method called.
Unsurprisingly, any one of the – willAnimate* methods calls are only sent to the root view, so, defining any of these methods in subviews is pointless.
These methods are called everytime the orientation is changed to an orientation accepted by the – shouldAutorotateToInterfaceOrientation: method. so I figured i could chnage my subviews' frame property from there.
To accomplish this, I defined the following method in my rootViewController class:
(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration{
subview1_ViewController.view.frame = CGRectMake(0,0,480,320);
subview2_ViewController.view.frame = CGRectMake(0,0,480,320);
...
}
I don't understand why the frame property is not updated, but I know this workaround works.
Hope this helps....