objective-c xcode ios6 uiinterfaceorientation autorotate

objective c - deshabilitar autorotate en un solo UIViewController en iOS6



objective-c xcode (4)

Tengo un proyecto que utiliza UINavigationController y segues funcionando correctamente, todos giran correctamente, el problema 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 :)


Completando la respuesta de GayleDDS para los novatos, acaba de agregar una subclase de UINavigationController que sugirió así:

#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 el viewController que quiero estar solo en modo vertical (fijo), luego solo agregué la importación a mi appdelegate.m

#import "UINavigationController.h"

y eso es


Echa un vistazo a este otro enfoque:

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

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

Funciona bien en iOS 7.

2015-01-30 Porque 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 los controladores 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


Según la guía de programación de View Controller

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. Este método se llama antes de realizar cualquier autorotación. Si devuelve NO, se suprime la rotación.

Por lo tanto, debe subclase ''UINavigationController'', implementar shouldAutorotate y use 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; }