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;
}