ios objective-c uiviewcontroller ios6 autorotate

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 .

y Entender la rotación de UIViewController cuando se incrusta en los controladores de vista de contenedor.


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