Каждого вида помещаемого на навигацию контроллеров суммироваться должны поддерживать одинаковые ориентации. Это означает, что некоторые контроллеры представлений не могут поддерживать только портрет, а другие поддерживают только пейзаж.Другими словами, все контроллеры с видом на той же самой навигационной стека контроллера должен возвращать то же самое в делегат:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
Но есть простое решение этой проблемы! Вот пример перехода от портрета к пейзажу. Вот шаги, чтобы сделать это, а ниже - код для его поддержки.
- Создайте «поддельный» контроллер вида, который будет root в контроллере суб-навигации. Этот контроллер просмотра должен поддерживать ландшафт.
- Создать новый экземпляр
UINavigationController
, добавьте экземпляр «фальшивой» контроллер представления в качестве корня и экземпляр контроллера вид ландшафта как второй вид контроллера
- Присутствует
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));
}
Вы могли бы поделиться образцом кода? –