Nueva presentación modal de iOS 13: la presentación del controlador no se mueve hacia abajo


11

Tengo un comportamiento extraño al presentar UIViewControllers modalmente en iOS 13. El nuevo estilo de presentación que he visto en todo iOS 13 se ve así:

El controlador de vista de presentación aparece detrás del controlador de vista de presentación. También se desplaza hacia abajo para imitar una "pila"

El controlador de vista de presentación aparece detrás del controlador de vista de presentación.  También se desplaza hacia abajo para imitar una "pila"

Mientras tanto, cuando presento controles de vista a través de mi aplicación, sigo obteniendo este efecto:

El controlador de vista de presentación no se mueve en absoluto cuando se presenta un nuevo controlador de vista

El controlador de vista de presentación no se mueve en absoluto cuando se presenta un nuevo controlador de vista

Yo uso este código para presentar este controlador de vista:

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Aquí está mi pregunta: me pregunto por qué está sucediendo esto y si hay una manera de presentar los controladores de vista en el estilo normal de iOS 13 (con el controlador de vista actual retrocediendo).

¡Gracias por adelantado!


Como prueba, intente comentar el controller.modalTransitionStyle = .coverVerticale incluso el controller.modalPresentationStyle = .pageSheet(aunque el estilo de presentación sería necesario si este código también se ejecuta en un iPad).
rmaddy

Lo comenté pero no cambia nada :(
CentrumGuy

Respuestas:


3

Resulta que el problema era mi jerarquía de controlador de vista. Pude solucionarlo haciendo que el controlador de vista de presentación sea el controlador de vista raíz de mi aplicación. Primero configuré el controlador de fondo como el controlador de vista raíz llamando

window.rootViewController = self

y luego usando mi código anterior

let controller = storyboard?.instantiateViewController(withIdentifier: "tutorial") as! TutorialController
controller.modalPresentationStyle = .pageSheet
controller.modalTransitionStyle = .coverVertical
present(controller, animated: true, completion: nil)

Le presenté el controlador de vista. ¡Gracias a todos los que intentaron ayudar!


Estoy teniendo el mismo problema. ¿Dónde configuró la bandera rootViewController? Justo antes de la segue?
Paweł Zgoda-Ferchmin

Lo configuré cuando presenté el "controlador de fondo". Llamémoslos controladores 1, 2 y 3 para facilitar las cosas (1 es el más alejado en la parte posterior, 2 está en el fondo detrás de 3 y 3 es el que está al frente, también conocido como Controlador Tutorial). Actualmente estamos viendo el controlador 1. En lugar de llamar a present () en el controlador 1 para presentar el controlador 2, simplemente configuro el controlador 2 como el controlador de vista raíz. Básicamente, esto elimina el controlador 1 y nuestra ventana ahora solo tiene el controlador 2 en su jerarquía. Ahora, puede presentar el controlador 3 normalmente llamando a present () en el controlador 2.
CentrumGuy

Claro, eso funciona para mí, pero causa una variedad de problemas diferentes, como la desaparición de la barra de estado o el corte de animación durante el segue, tampoco creo que sea seguro. Tiene que haber una mejor solución para esto ...
Paweł Zgoda-Ferchmin

¿Cuándo ocurren estos problemas? ¿Cuándo llamas al presente () o cuando configuras el controlador de vista raíz? La barra de estado que desaparece podría deberse a que la barra de estado está en texto negro y aparece sobre un fondo negro cuando aparece el presente (), lo que hace que se mezcle con el fondo de la aplicación.
CentrumGuy

1
Creé un proyecto de demostración simple. Puedes verlo aquí: github . Toda la lógica está en Controller1.swift. ¡Déjeme saber si esto ayuda!
CentrumGuy

1

Creo que el problema se puede resolver usando vc.modalPresentationStyle = .fullScreensi no hay UINavigationController, de lo contrario, puede usar estos códigos de la siguiente manera:

let navigationController = UINavigationController(rootViewController: vc) 
navigationController.modalPresentationStyle = .fullScreen 
present(vc, animated: true)

porque con iOS 13 esta es una nueva característica que Apple ha cambiado el estilo de presentación predeterminado de los Controladores de vista a una hoja modal desde pantalla completa en iOS 12


2
.fullScreen hace que parezca la antigua presentación de iOS 12 donde no se puede ver el controlador detrás de él. Eso no es lo que estoy buscando.
CentrumGuy

@CentrumGuy, puede ver el enlace " medium.com/better-programming/… ", se explicó en detalle.
Apple ha cambiado el valor predeterminado del

1
Sé que Apple cambió el estilo de presentación predeterminado en iOS 13. Sin embargo, cuando presento mis controladores de vista en mi aplicación, el controlador de presentación no se mueve como lo hace en cualquier otro lugar en iOS 13. Puede ver la diferencia entre el primero y el segundo imágenes en la forma en que se muestra el controlador de vista de presentación detrás del controlador de vista superior. Quiero que la mía se muestre como la primera imagen
CentrumGuy

¡Me alegro de poder ayudar!
Glotcha

1

Programáticamente:

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

Del guión gráfico:

ingrese la descripción de la imagen aquí

Eso es. No es necesario jugar con el controlador raíz o la ventana en absoluto.

Para referencia, visite este artículo .


0

Podemos cambiarlo en la barra de herramientas del Inspector. Para lograrlo: dirígete a la quinta sección de Inspector Tollbar y luego cambia el campo Presentación a Pantalla completa.


-1

Esta debería ser la única propiedad que necesita establecer

presentedViewController.modalPresentationStyle = .automatic

Detallado en https://developer.apple.com/videos/play/wwdc2019/224/


Establecerlo en automático no parece solucionar este problema
CentrumGuy

El controlador de vista detrás del controlador de vista de primer plano es el que yo llamo el "presente". (El que puedes ver detrás del controlador)
CentrumGuy

¿Es la raíz? puede consultar window.rootViewController
glotcha
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.