każdy widok popychane na nawigacji kontrolery stosu muszą obsługiwać te same kierunki. Oznacza to, że nie jest możliwe posiadanie niektórych kontrolerów widoku obsługujących tylko portret i innych tylko wspierających krajobraz.Innymi słowy wszystkie kontrolery widok na tym samym stosie kontroler nawigacji powinien wrócić w to samo delegata:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
Ale istnieje proste rozwiązanie tego! Oto przykład przejścia z portretu na krajobraz. Oto kroki, aby to zrobić, a poniżej znajduje się kod do jego obsługi.
- Utwórz "fałszywy" kontroler widoku, który będzie rootem w podrzędnym kontrolerze nawigacyjnym. Ten kontroler widoku powinien wspierać krajobraz.
- Utwórz nową instancję
UINavigationController
, dodać instancję „fałszywego” widoku kontrolera jako root i instancję kontrolera widoku krajobrazu jako drugi widok kontrolera
- przedstawić instancji
UINavigationController
jako modalnego z kontrolera widoku rodzica
Najpierw utwórz nowy kontroler widoku (FakeRootViewController) z tym kodem:
@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));
}
Oto kod do zaprezentowania kontroler widoku, który chcesz pokazać w Tryb krajobrazu:
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];
Pamiętaj, że landscapeViewController powinna także mieć tę realizacji:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
Czy możesz udostępnić przykładowy kod? –