У меня похожая проблема.
У меня есть игра, работающая в альбомной ориентации (как левая, так и правая).
Для управления приложением с несколькими представлениями я использую корневой UIviewController, то есть фиктивный UIViewcontroller с UIview, который ничего не делает. Затем я добавляю в него каждое другое UIview как подпредставление.
При запуске приложения эмулятор быстро поворачивается в портретную ориентацию, и я получаю каждый из моих видов со свойством frame, похожим на (0, -80 320,480). Это приводит к тому, что вид обрезается прямоугольником 160 X 320 с правой стороны.
Я заметил, что - shouldAutorotateToInterfaceOrientation: метод каждого подпредставления вызывается только один раз, и это происходит, когда он добавляется в корневое представление. Позже, при повороте устройства, только корневой вид получает его метод.
Неудивительно, что любой из вызовов методов - willAnimate * отправляется только в корневое представление, поэтому определение любого из этих методов в подпредставлениях бессмысленно.
Эти методы вызываются каждый раз, когда ориентация изменяется на ориентацию, принятую методом - shouldAutorotateToInterfaceOrientation:. поэтому я решил, что могу изменить свойство frame моих подпредставлений оттуда.
Для этого я определил следующий метод в своем классе rootViewController:
- (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);
...
}
Я не понимаю, почему свойство frame не обновляется, но я знаю, что этот обходной путь работает.
Надеюсь, это поможет ....