iOS 6 AutoRotate In UiNavigationController

Tengo UiNavigationController en mi aplicación. Quiero que solo una pantalla pueda rotar, así que puse en esta class:

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return YES; } -(BOOL)shouldAutorotate { return YES; } -(NSInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } 

pero el problema que ocurre es que en la pantalla de ecery la aplicación ocurre la rotation. ¿Cómo puedo desactivarlo?

Para iOS 6, estoy usando el siguiente código en mi aplicación, que le permite especificar la rotation para cada viewcontroller individualmente:

AppDelegate.m –

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{NSUInteger orientations =UIInterfaceOrientationMaskAllButUpsideDown; if(self.window.rootViewController){ UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; orientations = [presentedViewController supportedInterfaceOrientations]; } return orientations; } 

ViewController.m –

 - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskPortrait; } 

Los créditos para el código originalmente creo que ir al libro de Ray Wenderlich "iOS 6 por tutoriales". Sitio web Ray Wenderlich

Use el código siguiente en la class que desea autorizar solo:

 @interface UITabBarController (rotation) - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; - (NSUInteger)supportedInterfaceOrientations; - (BOOL)shouldAutorotate; @end @implementation UITabBarController (rotation) - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navController = (UINavigationController *) self.selectedViewController; if ([[navController visibleViewController] isKindOfClass:[CLASS_NAME_FOR_ROTATION class]]) return YES; } return (interfaceOrientation == UIInterfaceOrientationPortrait); } - (NSUInteger)supportedInterfaceOrientations { if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navController = (UINavigationController *) self.selectedViewController; if ([[navController visibleViewController] isKindOfClass:[CLASS_NAME_FOR_ROTATION class]]) return UIInterfaceOrientationMaskAll; } return UIInterfaceOrientationMaskPortrait; } - (BOOL)shouldAutorotate { if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navController = (UINavigationController *) self.selectedViewController; if ([[navController visibleViewController] isKindOfClass:[CLASS_NAME_FOR_ROTATION class]]) return YES; } return NO; } @end 

Use este código en el Controlador de vista principal de la class (es decir, la class anterior anterior en la stack del controller de navigation) que se debe rotar.

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } 

En su appDelegate agregue este código

 @property(nonatomic,assign)BOOL shouldRotate; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { shouldRotate=NO; } -(void)shouldAutoRotate:(BOOL)rotate { self.shouldRotate=rotate; } 

Y en su controller rootview, agregue este código

 #import "AppDelegate.h" #define myAppDelegate (AppDelegate *)[[UIApplication shanetworkingApplication] delegate] - (NSUInteger)supportedInterfaceOrientations { if(![myAppDelegate shouldRotate]) return UIInterfaceOrientationMaskPortrait; else return UIInterfaceOrientationMaskAllButUpsideDown; } 

Después de eso, agregue este código en viewcontroller.m, que es lo que quiere rotar

 - (void)viewDidLoad { [super viewDidLoad]; [myAppDelegate shouldAutoRotate:YES]; } -(void)viewWillDisappear:(BOOL)animated { [myAppDelegate shouldAutoRotate:NO]; } 

Lo he hecho para uno de mis proyectos (IOS 7). Funciona perfectamente para mí.

Puede crear una categoría para anular los methods en navigationController para admitir todas las classs.

 @implementation UINavigationController (Rotation_IOS6) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (UIInterfaceOrientation)prefernetworkingInterfaceOrientationForPresentation { return [[self.viewControllers lastObject] prefernetworkingInterfaceOrientationForPresentation]; } @end 

Si desea restringir la rotation en diferentes controlleres, anule los SupportInterfaceOrientations y shouldAutorote en los respectivos controlleres de vista cambiando el valor de retorno según sea necesario.

 -(NSUInteger)supportedInterfaceOrientations { return self.topViewController.supportedInterfaceOrientations; }