Каждый контроллер представления, помещенный в стек контроллеров навигации, должен поддерживать одинаковую ориентацию.Это означает, что невозможно иметь некоторые контроллеры представления, поддерживающие только портрет, а другие - только альбомную.Другими словами, все контроллеры представления в одном и том же стеке навигационных контроллеров должны возвращать одно и то же в делегате:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
Но есть простое решение для этого!Вот пример перехода от портрета к пейзажу.Вот шаги, чтобы сделать это, и ниже приведен код для его поддержки.
- Создайте «поддельный» контроллер представления, который будет корневым в дополнительном навигационном контроллере.Этот контроллер представления должен поддерживать ландшафт.
- Создать новый экземпляр
UINavigationController
, добавить экземпляр «поддельного» контроллера представления в качестве пользователя root и экземпляр вашего контроллера ландшафта в качестве второго контроллера представления - Представить экземпляр
UINavigationController
как модальный из родительского контроллера представления
Сначала создайте новый контроллер представления (FakeRootViewController) с этим кодом:
@interface FakeRootViewController : UIViewController
@property (strong, nonatomic) UINavigationController* parentNavigationController;
@end
@implementation FaceRootViewController
@synthesize parentNavigationController;
// viewWillAppear is called when we touch the back button on the navigation bar
(void)viewWillAppear:(BOOL)animated {
// Remove our self from modal view though the parent view controller
[parentNavigationController dismissModalViewControllerAnimated:YES];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
Здеськод для представления контроллера представления, который вы хотите отобразить в ландшафтном режиме:
FakeRootViewController* fakeRootViewController = [[FakeRootViewController alloc] init];[fakeRootViewController.navigationItem setBackBarButtonItem:backButton]; // Set back button
// The parent navigation controller is the one containing the view controllers in portrait mode.
fakeRootViewController.parentNavigationController = parentNavigationController;
UINavigationController* subNavigationController = // Initialize this the same way you have initialized your parent navigation controller.
UIViewController* landscapeViewController = // Initialize the landscape view controller
[subNavigationController setViewControllers:
[NSArray arrayWithObjects:fakeRootViewController,
landscapeViewController, nil] animated:NO];
[_navigationController presentModalViewController:subNavigationController animated:YES];
Помните, что у landscapeViewController также должна быть эта реализация:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}