Deshabilitar la rotation para ver el controller en el controller de navigation

En primer lugar, esto no es un duplicado. He examinado todas las preguntas relacionadas con esto en SO y ninguno de ellos funciona para mí. Espero que sea solo porque soy nuevo en el desarrollo de iOS, pero sospecho que esto no es posible en mi caso. He adjuntado una image con el controller de vista en círculo para el que quiero desactivar la rotation.

Ya lo he intentado: subclassando el controller de vista que quiero desactivar la rotation y usar el método shouldAutoRotate configurándolo en NO. Aparentemente esto no funciona porque es el controller de navigation el que determina si sus controlleres de vista pueden rotar. Entonces, UINavigationController y usé esta class en storyboard en lugar del controller de navigation pnetworkingeterminado. En esta class he establecido shouldAutoRotate to NO. Todavía no funciona. Realmente no sé lo que estoy haciendo mal.

Cuando extiendo el controller de vista raíz con mi class controller de vista con shouldAutoRotate establecido en NO, deshabilita la rotation … para toda la aplicación. Esto no es lo que quiero. Solo quiero que la rotation esté deshabilitada para el controller de vista en un círculo en la image.

introduzca la descripción de la imagen aquí

¡Gracias por adelantado!

Agregue su AppDelegate.h

 @property (nonatomic , assign) bool blockRotation; 

AppDelegate.m

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if (self.blockRotation) { return UIInterfaceOrientationMaskPortrait; } return UIInterfaceOrientationMaskAll; } 

En el controller de vista que desea desactivar la rotation

 - (void)viewDidLoad { [super viewDidLoad]; AppDelegate* shanetworking=[UIApplication shanetworkingApplication].delegate; shanetworking.blockRotation=YES; } -(void)viewWillDisappear:(BOOL)animated{ AppDelegate* shanetworking=[UIApplication shanetworkingApplication].delegate; shanetworking.blockRotation=NO; } 

Gracias a @ozgur por la solución que funcionó para mí. Yo 'votaría', pero al parecer no soy lo suficientemente bueno (¡lo que sea!) Para votar si una solución funciona o no. De todos modos, aquí está en Swift:

En AppDelegate.swift:

 class AppDelegate: UIResponder, UIApplicationDelegate { var blockRotation: Bool = false func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { if (self.blockRotation) { println("supportedInterfaceOrientations - PORTRAIT") return Int(UIInterfaceOrientationMask.Portrait.rawValue) } else { println("supportedInterfaceOrientations - ALL") return Int(UIInterfaceOrientationMask.All.rawValue) } } 

En el ViewController que desea bloquear la rotation, agregue UIApplicationDelegate a su class …

 class LoginViewController: UIViewController, UITextFieldDelegate, UIApplicationDelegate { 

y luego crea una reference al AppDelegate …

 var appDelegate = UIApplication.shanetworkingApplication().delegate as AppDelegate 

En viewDidLoad, establece appDelegate.blockRotation = true:

 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. appDelegate.blockRotation = true } 

En viewWillAppear, configure la orientación para forzar el dispositivo a la orientación elegida (Portrait en este ejemplo):

 override func viewWillAppear(animated: Bool) { let value = UIInterfaceOrientation.Portrait.rawValue UIDevice.currentDevice().setValue(value, forKey: "orientation") } 

Entonces en viewWillDisappear, o en prepareForSegue, configure appDelegate.blockRotation = false:

 override func viewWillDisappear(animated: Bool) { appDelegate.blockRotation = false } 

Esto funcionó para mí en este escenario exacto (controlleres de vista múltiple en un controller de navigation), después de muchas horas de leer otras soluciones en este sitio. Gracias de nuevo a @ ozgur – ¡ Votaré tu respuesta si pudiera!

¡Rastros felices!

Para aquellos de ustedes que usan Swift 2, pueden seguir la respuesta de Andre, pero en el paso uno, use el código a continuación en su AppDelegate.swift:

 class AppDelegate: UIResponder, UIApplicationDelegate { var blockRotation: Bool = false func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { if (self.blockRotation) { print("supportedInterfaceOrientations - PORTRAIT") return UIInterfaceOrientationMask.Portrait } else { print("supportedInterfaceOrientations - ALL") return UIInterfaceOrientationMask.All } } 

supportedInterfaceOrientationsForWindow: ahora devuelve un UIInterfaceOrientationMask en lugar de un Int.

Debe verificar que su controller de vista raíz esté permitido con la rotation en el controller superior actual y devolver SÍ o NO en el método supportInterfaceOrientations. Entonces debería ser como el siguiente código en su controller raíz ( adapte el código a su caso ):

 - (NSUInteger)supportedInterfaceOrientations { return [self.navigationController.topViewController supportedInterfaceOrientations]; } 

Luego, en cada controller de vista, agregue orientaciones de interfaz compatibles, por ejemplo:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 

UINavigationController + Categoría de rotation

Cuando utilice el controller de navigation SupportedInterfaceOrientaions de ViewController no funcionará agregando esta categoría a ur Project obtendrá la respuesta de su viewController también en lugar de NavigationController solo.

Mi caso tiene controller de 3 vistas:
– primer controller de vista: retrato
– segundo controller de vista: paisaje derecho (tiene controller de navigation y fue presentado por el primer controller de vista)
– Controlador de tercera vista: retrato (tiene controller de navigation y fue empujado por el segundo controller de vista)
Y esta es mi solución en swift 3:
————————————
En AppDelegate :
– Agregar esta propiedad para save su configuration

 private var orientation: UIInterfaceOrientationMask = .portrait 

-Entonces, crea una function para configurar rotate para tu dispositivo:

 func rotateScreen(orientation: UIInterfaceOrientationMask) { self.orientation = orientation var value = 0; if orientation == .landscapeRight { value = UIInterfaceOrientation.landscapeRight.rawValue }else { value = UIInterfaceOrientation.portrait.rawValue } UIDevice.current.setValue(value, forKey: "orientation") } 

– Finalmente, implementar el método de orientación de soporte:

 func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientation } 

——————————–
Entonces puede llamar así antes de mostrar el controller de vista de destino

 (UIApplication.shanetworking.delegate as! AppDelegate).rotateScreen(orientation: .landscapeRight) 

Por ejemplo, en mi caso: cuando el usuario presiona el button en Primero para presentar el Segundo, haré así

 (UIApplication.shanetworking.delegate as! AppDelegate).rotateScreen(orientation: .landscapeRight) self.present(navigation, animated: true, completion: nil) 

Y el button de cerrar en el segundo haré así

 (UIApplication.shanetworking.delegate as! AppDelegate).rotateScreen(orientation: .portrait) self.dismiss(animated: true, completion: nil) 

¡Eso es todo! Nunca te importaría usar el controller de navigation o no. Espero que esto te ayude ^ __ ^!