Dado que mi aplicación tiene soporte para todas las orientaciones. Me gustaría bloquear solo el modo vertical en un UIViewController específico.
por ejemplo, supongamos que se trataba de una aplicación con pestañas y cuando la vista de inicio de sesión aparece de forma modal, solo quiero que la vista de inicio de sesión esté en el modo vertical sin importar cómo el usuario gire el dispositivo o cómo será la orientación actual del dispositivo
swift
uiviewcontroller
portrait
device-orientation
Thiha Aung
fuente
fuente
Respuestas:
Las cosas pueden complicarse bastante cuando tiene una jerarquía de vista complicada, como tener varios controladores de navegación y / o controladores de vista de pestañas.
Esta implementación permite que los controladores de vista individuales establezcan cuándo les gustaría bloquear las orientaciones, en lugar de depender del Delegado de la aplicación para encontrarlas iterando a través de subvistas.
Rápido 3, 4, 5
En AppDelegate:
En alguna otra estructura global o clase auxiliar, aquí creé AppUtility:
Luego, en el ViewController deseado, desea bloquear las orientaciones:
Si iPad o aplicación universal
Asegúrese de que "Requiere pantalla completa" esté marcado en Configuración de destino -> General -> Información de implementación.
supportedInterfaceOrientationsFor
no se llamará al delegado si no está marcado.fuente
Requires full screen
, evitará que la aplicación esté disponible para Slide Over y Split View. Consulte Adopción de mejoras multitarea en iPad de Apple. Tengo una respuesta que no requiere habilitarRequires full screen
Rápido 4
AppDelegate
Su ViewController agregue la siguiente línea si solo necesita orientación vertical. tienes que aplicar esto a todas las necesidades de ViewController para mostrar el modo vertical.
y eso hará que la orientación de la pantalla para otros Viewcontroller sea de acuerdo con la orientación física del dispositivo.
fuente
func application
delegado original dentro de la aplicación con esta función?func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock ?
Swift 3 y 4
Establezca la
supportedInterfaceOrientations
propiedad de UIViewControllers específicos como este:ACTUALIZAR
Esta solución solo funciona cuando su no
viewController
está incrustado , porque la orientación hereda del viewController principal. Para este caso, puede crear una subclase de y establecer estas propiedades en él.UINavigationController
UINavigationViewController
fuente
Agregue este código para forzar el retrato y bloquearlo:
En su AppDelegate, configure supportedInterfaceOrientationsForWindow en las orientaciones que desee que admita toda la aplicación:
fuente
Esta es una solución genérica para su problema y otros relacionados.
1. Cree la clase auxiliar UIHelper y aplique los siguientes métodos:
2. Crea un Protocolo con tu comportamiento deseado, pues tu caso específico será retrato.
orientación del protocoloIsOnlyPortrait {}
Nota: Si lo desea, agréguelo en la parte superior de UIHelper Class.
3. Amplíe su controlador de vista
En tu caso:
4. En la clase de delegado de la aplicación, agregue este método:
Notas finales:
fuente
Un montón de excelentes respuestas en este hilo, pero ninguna satisfizo mis necesidades. Tengo una aplicación con pestañas con controladores de navegación en cada pestaña, y una vista necesitaba rotar, mientras que las otras debían estar bloqueadas en vertical. El controlador de navegación no estaba cambiando el tamaño de sus subvistas correctamente, por alguna razón. Encontré una solución (en Swift 3) al combinar con esta respuesta, y los problemas de diseño desaparecieron. Cree la estructura como lo sugiere @bmjohns:
Entonces subclase UITabBarController:
No olvide cambiar la clase de TabBarController en el guión gráfico a la subclase recién creada.
fuente
Para una nueva versión de Swift, pruebe esto
fuente
Aquí hay una forma simple que funciona para mí con Swift 4.2 (iOS 12.2), póngalo en un lugar
UIViewController
para el que desea deshabilitar shouldAutorotate:La
.portrait
parte le dice en qué orientación (es) permanecer, puede cambiar esto como desee. Las opciones son:.portrait
,.all
,.allButUpsideDown
,.landscape
,.landscapeLeft
,.landscapeRight
,.portraitUpsideDown
.fuente
Para configurar la orientación horizontal para todas las vistas de su aplicación y permitir solo una vista para todas las orientaciones (para poder agregar el carrete de la cámara, por ejemplo):
En AppDelegate.swift:
En: didFinishLaunchingWithOptions
En otra parte de AppDelegate.swift:
Luego, en la vista que sigue a la que desea poder tener todas las orientaciones:
Lo último es marcar Orientación del dispositivo: - Vertical - Horizontal izquierda - Horizontal derecha
fuente
Crear nueva extensión con
fuente
bmjohns -> Tú eres mi salvador. Esa es la única solución que funciona (con la estructura AppUtility)
He creado esta clase:
y siguió sus instrucciones, y todo funciona perfectamente para Swift 3 -> xcode versión 8.2.1
fuente
A partir de iOS 10 y 11, el iPad admite Slide Over y Split View. Para habilitar una aplicación en Slide Over y Split View,
Requires full screen
debe estar desmarcada. Eso significa que la respuesta aceptada no se puede usar si la aplicación quiere admitir Slide Over y Split View. Vea más de Apple Adopting Multitasking Enhancements en iPad aquí .Tengo una solución que permite (1) desmarcar
Requires full screen
, (2) implementar solo una funciónappDelegate
(especialmente si no desea / no puede modificar los controladores de vista de destino) y (3) evitar llamadas recursivas. Sin necesidad de clases auxiliares ni extensiones.appDelegate.swift (Swift 4)
Editar
@bmjohns señaló que esta función no se llama en iPad. Verifiqué y sí no se llamó. Entonces, hice un poco más de pruebas y descubrí algunos hechos:
Requires full screen
porque quiero habilitar Slide Over y Slide View en iPad. Eso requiere la aplicación para apoyar a los 4 orientación para el iPad, en Info.plist:Supported interface orientations (iPad)
.Mi aplicación funciona de la misma manera que Facebook: en iPhone, la mayoría de las veces está bloqueada en modo vertical. Al ver la imagen en pantalla completa, permite a los usuarios rotar el paisaje para ver mejor. En iPad, los usuarios pueden rotar a cualquier orientación en cualquier controlador de vista. Por lo tanto, la aplicación se ve bien cuando el iPad está colocado sobre Smart Cover (horizontal a la izquierda).
Para que iPad llame
application(_:supportedInterfaceOrientationsFor)
, en Info.plist, solo mantenga retrato para iPad. La aplicación perderá la capacidad Slide Over + Split View. Pero puede bloquear o desbloquear la orientación para cualquier controlador de vista, en un solo lugar y sin necesidad de modificar la clase ViewController.Finalmente, esta función se llama en el ciclo de vida del controlador de vista, cuando se muestra / elimina la vista. Si su aplicación necesita bloquear / desbloquear / cambiar la orientación en otro momento, es posible que no funcione
fuente
Solución real probada para esto . En mi ejemplo, necesito que toda la aplicación esté en modo vertical, pero solo la orientación de una pantalla debe estar en modo horizontal.
Codifique en AppDelegate como se describen las respuestas anteriores.
Luego, escriba este código antes de que se presente / presione el controlador de vista de orientación horizontal.
Luego, escriba este código en el controlador de vista real (para vista horizontal)
fuente
Experimenté un poco y logré encontrar una solución limpia para este problema. El enfoque se basa en el etiquetado de vista a través de vista-> etiqueta
En el ViewController de destino, simplemente asigne la etiqueta a la vista raíz como en el siguiente ejemplo de código:
Y finalmente en AppDelegate.swift verifique si la vista que se muestra actualmente es la que etiquetamos:
Este enfoque ha sido probado con mi simulador y parece que funciona bien.
Nota: la vista marcada también se encontrará si el MVC actual se superpone con algún ViewController secundario en la pila de navegación.
fuente
Gracias a la respuesta de @ bmjohn anterior. Aquí hay una versión de Xamarin / C # funcional del código de esa respuesta, para ahorrarles a otros el tiempo de transcripción:
AppDelegate.cs
Clase Static OrientationUtility.cs:
Ver controlador:
fuente
La mejor solución para bloquear y cambiar la orientación en vertical y horizontal:
Vea este video en YouTube:
https://m.youtube.com/watch?v=4vRrHdBowyo
Este tutorial es mejor y más sencillo.
o use el siguiente código:
Ver esta imagen
// 1- en el segundo viewcontroller configuramos landscapeleft y en el primer viewcontroller configuramos portrat:
// 2- si usa NavigationController, debe agregar una extensión
fuente