deshabilitar autorotación en un solo UIViewController en iOS6

Tengo un proyecto que usa UINavigationController y funciona correctamente, todos giran correctamente, la cosa es … Solo quiero deshabilitar la autorotation en un UIViewController específico. Intenté esto:

 - (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation { return NO; } // New Autorotation support for iOS 6. - (BOOL)shouldAutorotate NS_AVAILABLE_IOS(6_0){ return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

pero no funciona, mi UIViewController sigue girando automáticamente, cualquier ayuda será bienvenida 🙂

Según la Guía de progtwigción del controlador de visualización

Si desea deshabilitar temporalmente la rotación automática, evite manipular las máscaras de orientación para hacer esto. En su lugar, anule el método shouldAutorotate en el controlador de vista inicial. Se llama a este método antes de realizar cualquier autorrotación. Si devuelve NO, entonces la rotación se suprime.

Por lo tanto, debe subclase ‘UINavigationController’, implementar shouldAutorotate y usar su clase de controlador de navegación en su guión gráfico.

 - (BOOL)shouldAutorotate { id currentViewController = self.topViewController; if ([currentViewController isKindOfClass:[DetailViewController class]]) return NO; return YES; } 

Voy a completar la respuesta de GayleDDS para los novatos. Acabo de agregar una subclase de UINavigationController tal como lo sugirió:

 #import "UINavigationController.h" #import "MonthCalendarVC.h" @implementation UINavigationController (overrides) - (BOOL)shouldAutorotate { id currentViewController = self.topViewController; if ([currentViewController isKindOfClass:[MonthCalendarVC class]]) return NO; return YES; } @end 

MonthCalendarVC es viewController Quiero estar solo en modo vertical (fijo), luego solo agregué la importación a mi appdelegate.m

 #import "UINavigationController.h" 

y eso es

Eche un vistazo a este otro enfoque:

http://www.sebastianborggrewe.de/only-make-one-single-view-controller-rotate/

Solo tiene que implementar canRotate en ViewController para permitir la rotación.

Funciona bien en iOS 7.

2015-01-30 Debido a que el sitio de Sebastian parece no funcionar (error 404), esta es mi interpretación de su solución:

A diferencia de sebastian, prefiero usar un protocolo (como la interfaz en C #) para evitar crear un método “- (void) canrotate:” en cada uno de mis controles de vista.

 IRotationCapabilities.h ----------------------- #ifndef NICE_APPS_IRotationCapabilities_h #define NICE_APPS_IRotationCapabilities_h @protocol IRotationCapabilities < NSObject > // Empty protocol @end #endif FirstViewController.h --------------------- - ( void )viewWillAppear:( BOOL )animated { [ super viewWillAppear:animated ]; // Forces the portrait orientation, if needed if( ![ self conformsToProtocol:@protocol( IRotationCapabilities ) ] ) { if( self.navigationController.interfaceOrientation != UIInterfaceOrientationPortrait ) { [ [ UIDevice currentDevice ] setValue:@( 1 ) forKey:@"orientation" ]; } } } SecondViewController.h ----------------------- #import "IRotationCapabilities.h" @interface SecondViewController : UIViewController < IRotationCapabilities > AppDelegate.m ------------- #pragma mark - Orientation management - ( NSUInteger )application:( UIApplication * )application supportedInterfaceOrientationsForWindow:( UIWindow * )window { if( __iPhone ) { // Gets topmost/visible view controller UIViewController * currentViewController = [ self topViewController ]; // Checks whether it implements rotation if( [ currentViewController conformsToProtocol:@protocol( IRotationCapabilities ) ] ) { // Unlock landscape view orientations for this view controller return ( UIInterfaceOrientationMaskAllButUpsideDown ); } // Allows only portrait orientation (standard behavior) return ( UIInterfaceOrientationMaskPortrait ); } else { // Unlock landscape view orientations for iPad return ( UIInterfaceOrientationMaskAll ); } } 

Intenta implementar eso en tu UIViewController:

 // implements the interface orientation (iOS 6.x) @interface UINavigationController (RotationNone) -(NSUInteger)supportedInterfaceOrientations; @end @implementation UINavigationController (RotationNone) -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } @end