ios - ¿Impedir autorotate para un controlador de vista?
objective-c uiviewcontroller (3)
Cuando esté involucrado un UINavigationController
, cree una categoría en el UINavigationController
e UINavigationController
las UINavigationController
override supportedInterfaceOrientations
.
#import "UINavigationController+Orientation.h"
@implementation UINavigationController (Orientation)
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate
{
return YES;
}
@end
Ahora, los contenedores de iOS (como UINavigationController) no consultan a sus hijos para determinar si deben autotardar.
Cómo crear una categoría
1. Agregue un nuevo archivo (categoría c de Objective en cocoa touch)
2. Category
: Orientación en UINavigationController
3. Agregue el código anterior a UINavigationController+Orientation.m
Mi aplicación puede autorotarse pero necesito una de las vistas para mostrar solo en modo retrato y no sé cómo lograrlo.
Intenté esto (entre otras cosas) pero la vista en cuestión todavía gira:
// ViewController.m
-(BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
¿Puede alguien señalar amablemente lo que estoy haciendo mal? Gracias.
-editar-
Es para iOS 6.1.
Según la documentation .
Un controlador de vista puede anular el método supportInterfaceOrientations para limitar la lista de orientaciones admitidas.
Por lo tanto, debemos anular shouldAutorotate
y shouldAutorotate
para los view controllers
destino.
Normalmente, el sistema llama a este método solo en el controlador de vista raíz de la ventana o en un controlador de vista presentado para llenar toda la pantalla.
Esto funcionará si tiene una configuración muy simple, ya que el view controller
destino es el view controller
rootViewController
de la window
o se presenta cubriendo toda la pantalla.
En caso de que la configuración del controlador de vista de destino sea compleja, como la incrustada en otros controladores de vista de contenedor.
los controladores de vista secundarios utilizan la parte de la ventana proporcionada por el controlador de vista principal y ya no participan directamente en las decisiones sobre qué rotaciones son compatibles.
Por lo tanto, puede ser la implementación predeterminada de estos controladores de vista de contenedor que no solicitan a los hijos la preferencia de SupportInterfaceOrientation.
Por lo tanto, para permitir que nuestro child view controller
destino especifique la información de orientación de supportedIntefaceOrientation
, necesitamos indicar al controlador de vista de contenedor que lo haga.
También puedes consultar mi respuesta anterior here .
Swift 3 version la respuesta aceptada:
extension UINavigationController {
open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
// Change `.portrait` to whatever your default is throughout your app
return topViewController?.supportedInterfaceOrientations ?? .portrait
}
open override var shouldAutorotate: Bool {
return true
}
}