Antes de iOS 8, utilizamos el siguiente código junto con compatiblesInterfaceOrientations y debeAutoRotate los métodos de delegado para forzar la orientación de la aplicación a cualquier orientación particular. Utilicé el fragmento de código a continuación para rotar mediante programación la aplicación a la orientación deseada. En primer lugar, estoy cambiando la orientación de la barra de estado. Y luego, simplemente presentar y descartar inmediatamente una vista modal gira la vista a la orientación deseada.
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:YES];
UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:vc animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
Pero esto está fallando en iOS 8. Además, he visto algunas respuestas en el desbordamiento de pila donde la gente sugirió que siempre debemos evitar este enfoque desde iOS 8 en adelante.
Para ser más específico, mi aplicación es un tipo universal de aplicación. Hay tres controladores en total.
Controlador First View : debe admitir todas las orientaciones en iPad y solo retrato (botón de inicio hacia abajo) en iPhone.
Segundo controlador de vista : debe admitir solo el paisaje justo en todas las condiciones
Tercer controlador de vista : debe admitir solo el paisaje justo en todas las condiciones
Estamos utilizando el controlador de navegación para la navegación de la página. Desde el primer controlador de vista, en una acción de clic de botón, estamos empujando el segundo en la pila. Entonces, cuando llega el segundo controlador de vista, independientemente de la orientación del dispositivo, la aplicación debe bloquearse solo en el paisaje.
A continuación se muestra mi shouldAutorotate
y supportedInterfaceOrientations
métodos en el controlador de segunda y tercera vista.
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscapeRight;
}
-(BOOL)shouldAutorotate {
return NO;
}
¿Existe alguna solución para esto o alguna otra forma mejor de bloquear un controlador de vista en una orientación particular para iOS 8. Por favor, ayuda!
fuente
Respuestas:
Para iOS 7-10:
C objetivo:
Swift 3:
Simplemente llámelo desde
- viewDidAppear:
el controlador de vista presentado.fuente
[UIView setAnimationsEnabled:NO];
enviewWillAppear
y[UIView setAnimationsEnabled:YES];
enviewDidAppear
, relacionada: stackoverflow.com/a/6292506/88597[UINavigationController attemptRotationToDeviceOrientation];
La rotación de orientación es un poco más complicada si está dentro de un
UINavigationController
oUITabBarController
. El problema es que si un controlador de vista está incrustado en uno de estos controladores, el controlador de navegación o barra de pestañas tiene prioridad y toma las decisiones sobre autorrotación y orientaciones compatibles.Utilizo las siguientes 2 extensiones en UINavigationController y UITabBarController para que los controladores de vista integrados en uno de estos puedan tomar las decisiones.
¡Dale a los controladores de vista el poder!
Swift 2.3
Swift 3
Ahora puede anular el
supportedInterfaceOrientations
método o puede anularshouldAutoRotate
en el controlador de vista que desea bloquear; de lo contrario, puede omitir las anulaciones en otros controladores de vista que desee heredar el comportamiento de orientación predeterminado especificado en la lista de aplicaciones.Deshabilitar rotación
Bloquear a orientación específica
En teoría, esto debería funcionar para todas las jerarquías complejas de controladores de vista, pero he notado un problema con UITabBarController. Por alguna razón, quiere usar un valor de orientación predeterminado. Consulte la siguiente publicación de blog si está interesado en aprender sobre cómo solucionar algunos de los problemas:
Rotación de pantalla de bloqueo
fuente
Esto es lo que funcionó para mí:
https://developer.apple.com/library//ios/documentation/UIKit/Reference/UIViewController_Class/index.html#//apple_ref/occ/clm/UIViewController/attemptRotationToDeviceOrientation
Llámalo en tu vistaDidAppear: método.
fuente
Descubrí que si se trata de un controlador de vista presentado, puede anular
preferredInterfaceOrientationForPresentation
Rápido:
fuente
Así funciona para mí en Swift 2 iOS 8.x:
PD (este método no requiere anular las funciones de orientación, como debe ser la auto-rotación en cada viewController, solo un método en AppDelegate)
Marque "requiere pantalla completa" en la información general de su proyecto.
Entonces, en AppDelegate.swift crea una variable:
Entonces, pon también esta función:
Por lo tanto, en cada clase de su proyecto, puede configurar esta var en viewWillAppear:
Si necesita hacer una elección basada en el tipo de dispositivo, puede hacer esto:
fuente
En primer lugar, esta es una mala idea, en general, algo anda mal con la arquitectura de su aplicación, pero
sh..t happens
, si es así, puede intentar hacer algo como a continuación:Que en
AppDelegate
Y cuando quiera cambiar de orientación, haga lo siguiente:
Nota: A veces, el dispositivo puede no actualizarse desde dicha llamada, por lo que es posible que deba hacer lo siguiente
Eso es todo
fuente
Esto debería funcionar desde iOS 6 en adelante, pero solo lo he probado en iOS 8. Subclase
UINavigationController
y anular los siguientes métodos:O pregunte al controlador de vista visible
e implementar los métodos allí.
fuente
Esta es una respuesta a los comentarios en la respuesta de Sid Shah , sobre cómo deshabilitar las animaciones usando:
Código:
fuente
Si está utilizando navigationViewController, debe crear su propia superclase para esto y anular:
esto deshabilitará la rotación en SecondViewController, pero si presiona su SecondViewController cuando su dispositivo está en orientación vertical, su SecondViewController aparecerá en modo vertical.
Suponga que está usando el guión gráfico. Debe crear segue manual ( Cómo ) y en su método "onClick":
Esto forzará la orientación horizontal antes de que su superclase desactive la función de autorrotación.
fuente
En
Xcode 8
los métodos se convierten en propiedades, por lo que lo siguiente funciona conSwift
:fuente
portrait
modo sin importar cuál sea la orientación en el iPad, y alshouldAutorotate
volver cierto, lo logré.He intentado muchas soluciones, pero la que funcionó es la siguiente:
No hay necesidad de editar los
info.plist
ios 8 y 9.Posibles orientaciones de la documentación de Apple :
fuente
La combinación de las respuestas de Sids y Koreys funcionó para mí.
Extender el controlador de navegación:
Luego deshabilitar la rotación en la vista única
Y girando a la orientación apropiada antes del segue
fuente
La solución superior anterior:
no funcionó para mí cuando lo llamé en viewDidAppear del controlador de vista presentado. Sin embargo, funcionó cuando lo llamé en preparForSegue en el controlador de vista de presentación.
(Lo siento, no hay suficientes puntos de reputación para comentar sobre esa solución, así que tuve que agregarla así)
fuente
[iOS9 +] Si alguien arrastró todo el camino hasta aquí, ya que ninguna de las soluciones anteriores funcionó, y si presenta la vista que desea cambiar de orientación por segue, es posible que desee comprobar esto.
Verifique el tipo de presentación de su segue. La mía estaba "sobre el contexto actual". Cuando lo cambié a pantalla completa, funcionó.
Gracias a @GabLeRoux, encontré esta solución.
fuente
Mis requisitos son
AVPlayerViewController
para reproducir videoCuando se reproduce un video, si es un paisaje, entonces permita que la pantalla gire el paisaje a la derecha y el paisaje a la izquierda. Si es un retrato, bloquee la vista solo en modo vertical.
Primero, defina
supportedInterfaceOrientationsForWindow
enAppDelegate.swift
Segundo, en su controlador de vista principal, defina las siguientes funciones
Entonces, necesitas subclase
AVPlayerViewController
Anular estas tres funciones en
MyPlayerViewController.swift
Debido a que el usuario puede rotar el dispositivo horizontalmente a la izquierda o horizontal derecha, necesitamos configurar la rotación automática para que sea verdadera
Finalmente, cree una
MyPlayerViewController
instancia en su controlador de vista y establezca el valor del tamaño de la propiedad.Inicie a su jugador con el adecuado
videoUrl
, luego asigne su jugador aplayerViewController
. ¡Feliz codificación!fuente
fuente
Todavía parece haber cierto debate sobre la mejor manera de lograr esta tarea, así que pensé en compartir mi enfoque (de trabajo). Agregue el siguiente código en su
UIViewController
implementación:Para este ejemplo, también deberá establecer las orientaciones de dispositivo permitidas en 'Paisaje a la izquierda' en la configuración de su proyecto (o directamente en
info.plist
). Simplemente cambie la orientación específica que desea forzar si desea algo más queLandscapeLeft.
La clave para mí fue la
attemptRotationToDeviceOrientation
llamadaviewWillAppear
, sin eso la vista no rotaría correctamente sin rotar físicamente el dispositivo.fuente
De acuerdo a la respuesta de Korey Hinton
Swift 2.2:
Deshabilitar rotación
Bloquear a orientación específica
fuente
Intenté algunas soluciones aquí y lo importante es entender que es el controlador de vista raíz el que determinará si rotará o no.
Creé el siguiente proyecto de Objective -C github.com/GabLeRoux/RotationLockInTabbedViewChild con un ejemplo funcional de un
TabbedViewController
en el que una vista secundaria se permite girar y la otra vista secundaria se bloquea en vertical.No es perfecto, pero funciona y la misma idea debería funcionar para otro tipo de vistas raíz como
NavigationViewController
. :)fuente
De acuerdo con la solución mostrada por @ sid-sha, debe poner todo en el
viewDidAppear:
método, de lo contrario no serádidRotateFromInterfaceOrientation:
despedido, así que algo como:fuente
Mi solución
En
AppDelegate
:XXViewController
es el ViewController que desea admitir en modo horizontal.Entonces la solución de Sunny Shah funcionaría en
XXViewController
cualquier versión de iOS:Esta es la función de utilidad para encontrar el ViewController más superior.
fuente
Use esto para bloquear la orientación del controlador de vista, probado en iOS 9:
// Bloquear la orientación al paisaje a la derecha
fuente
Tengo el mismo problema y malgasto mucho tiempo. Entonces ahora tengo mi solución. La configuración de mi aplicación es solo compatible con retrato. Sin embargo, algunas pantallas en mi aplicación solo necesitan tener un paisaje. Lo soluciono con una variable isShouldRotate en AppDelegate . Y la función en AppDelegate :
Y finalmente cuando un ViewControllerA necesita un estado horizontal. Simplemente haga eso: antes de enviar / presentar a ViewController, una asignación debe ser Rotar a verdadero . No olvide cuando emerge / descarta que la asignación del controlador esShouldRotate a false en viewWillDisappear .
fuente
Para mí, el VC de nivel superior necesitaba implementar las anulaciones de orientación. El uso de VC en la pila no tendrá efecto si el VC superior no se está implementando.
Solo se escucha VC-Main, esencialmente en mis pruebas.
fuente
Parece que incluso aquí tienes tantas respuestas que nadie fue suficiente para mí. Quería forzar la orientación y luego, al regresar, volver a la orientación del dispositivo, pero
[UIViewController attemptRotationToDeviceOrientation];
simplemente no funcionó. Lo que también hizo que todo se complicara es que agregué shouldAutorotate to false en función de alguna respuesta y no pude obtener los efectos deseados para rotar correctamente en todos los escenarios.Entonces esto es lo que hice:
Antes de presionar el controlador en llamada en su constructor init esto:
Así que guardo la última orientación del dispositivo y me registro para el evento de cambio de orientación. El evento de cambio de orientación es simple:
Y a la vista de desestimación, simplemente vuelvo a cualquier orientación que tenga como usuario.
Y esto tiene que estar allí también:
Y también el controlador de navegación tiene que delegar en shouldAutorotate y SupportInterfaceOrientations, pero eso creo que la mayoría de las personas ya lo tienen.
PD: Lo siento, uso algunas extensiones y clases base, pero los nombres son bastante significativos, por lo que el concepto es comprensible, hará aún más extensiones porque ahora no es demasiado bonito.
fuente