Я реализовал этот точный тип поведения в приложении, и ключ к нему заключается в том, чтобы убедиться, что любые родительские контроллеры реализуют mustAutorotateToInterfaceOrientation и что ваш текущий контроллер представления также реализует его. В моем случае я использую контроллер вкладок, который перехватывает вызов shouldAutorotateToInterfaceOrientation, и мне пришлось переопределить контроллер вкладок, чтобы завершить вызов. Поведение контроллеров представления по умолчанию - отображать только в портретном режиме.
Так что вам нужно заставить их разрешить все изменения ориентации через:
- (BOOL) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {
вернуть ДА;
}
Затем, чтобы загрузить новый контроллер представления, вы должны ответить:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
if((fromInterfaceOrientation == UIInterfaceOrientationPortrait) ||
(fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown))
{
// Load the view controller you want to display in landscape mode...
}
}
и может также использовать:
-(void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Чтобы определить, что произойдет изменение ориентации.
В моем случае я использую didRotateFromInterfaceOrientation, чтобы проверить, была ли последняя ориентация портретной, и если это так, загрузить вид, который я хочу отобразить в альбомном режиме.
Затем я реализовал те же методы в контроллере представления, который загружаю, и он отвечает за обнаружение, когда ориентация возвращается к портретному, и исключение себя из стека представления.
Надеюсь, это немного поможет.
Пол