Deshabilite el cierre interactivo del controlador de vista presentado en iOS 13

135

iOS 13 presenta un nuevo diseño de modalPresentationStyle .pageSheet(y su hermano .formSheet) para controladores de vista presentados modalmente ...

La nueva presentación modal deslizante en iOS 13

… Y podemos descartar estas hojas deslizando el controlador de vista presentado hacia abajo (descarte interactivo) . Aunque la nueva función "tirar para descartar" es bastante útil, es posible que no siempre sea deseable.

LA PREGUNTA: ¿Cómo podemos desactivar el despido interactivo? - Tenga en cuenta que mantenemos el mismo estilo de presentación.

Jakub Truhlář
fuente
4
Posible duplicado de Presentación modal en iOS 13 a pantalla completa
Mehul Thakkar
6
@MehulThakkar Esa es una pregunta diferente.
Jakub Truhlář

Respuestas:

240

Opción 1:

viewController.isModalInPresentation = true

Despido interactivo para discapacitados

(El .pageSheetdespido interactivo deshabilitado actúa así).

  • Desde iOS 13, UIViewControllercontiene una nueva propiedad llamada isModalInPresentationque debe configurarse truepara evitar el despido interactivo.
  • Básicamente, ignora los eventos fuera de los límites del controlador de vista. Tenga esto en cuenta si está utilizando no solo el estilo automático, sino también estilos de presentación como, .popoveretc.
  • Esta propiedad es falsepor defecto.

De los documentos oficiales : Si true, UIKit ignora los eventos fuera de los límites del controlador de vista y evita el cierre interactivo del controlador de vista mientras está en pantalla.


Opcion 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Desde iOS 13, UIAdaptivePresentationControllerDelegatecontiene un nuevo método llamado presentationControllerShouldDismiss.
  • Este método solo se llama si el controlador de vista presentado no se descarta mediante programación y su isModalInPresentationpropiedad está establecida en false.

Consejo: no olvide asignar el delegado de PresentationController.

Jakub Truhlář
fuente
2
Si el controlador de vista presentado es un controlador de navegación, puede configurarlo isModalInPresentationen el controlador de navegación o en los controladores de vista individuales que se muestran en la pila de navegación. Este último le permite elegir pantalla por pantalla si es posible el despido interactivo. Cuidado con los controladores de búsqueda, tienen prioridad sobre el controlador de vista individual (pero no el controlador de navegación). Más información en la publicación de mi blog: medium.com/@hacknicity/…
Geoff Hackworth
1
Tenga en cuenta que si su VC se presenta como un popover, esto evitará que el popover se descarte al tocar fuera de él
PatrickDotStar
4
Objective-C:viewController.modalInPresentation = YES;
quarac
3
¿Alguien consiguió que esto funcionara al colocar esta bandera en un UIImagePickerController? Para nosotros, parece que lo UIImagePickerControllerestá ignorando y, por lo tanto, puede descartarse con el gesto de deslizar. Tal vez sea un error de iOS 13.
PatrickDotStar
4
Cuando presentationControllerShouldDismiss(_ presentationController: UIPresentationController)devuelve falso, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)se llama para que pueda hacer cosas como agregar un diálogo de confirmación si el usuario ha ingresado datos.
Neil
66
  1. Si desea el mismo comportamiento que en la versión anterior de iOS (<iOS13) como la presentación del modelo en pantalla completa, simplemente configure el estilo de presentación de su controlador de vista de destino en UIModalPresentationStyle.fullScreen

    let someViewController = \*VIEW CONTROLLER*\
    someViewController.modalPresentationStyle = .fullScreen

    Y si está utilizando el guión gráfico, simplemente seleccione el segua y seleccione Full Screendel Presentationmenú desplegable.

    ingrese la descripción de la imagen aquí

  2. Si solo desea deshabilitar el descarte interactivo y mantener la UIViewControllerpropiedad de conjunto de estilo de presentación nuevo isModalInPresentationen true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }
Bilal
fuente
Funciona mejor que usar {controller.isModalInPresentation = true}.
Maxim Firsoff
8

La propiedad isModalInPresentationpodría ayudar.

De la documentación:

Cuando lo establece en true, UIKit ignora los eventos fuera de los límites del controlador de vista y evita el cierre interactivo del controlador de vista mientras está en pantalla.

Puedes usarlo así:

let controller = MyViewController()
controller.isModalInPresentation = true
self.present(controller, animated: true, completion: nil)
Mohit Tomar
fuente
5

Si está utilizando guiones gráficos para diseñar su interfaz de usuario, he encontrado que la mejor manera de deshabilitar este rechazo interactivo al usar un controlador de navegación es cambiar la presentación del controlador de navegación en el inspector de atributos de Automático a Pantalla completa. Todos los controladores de vista en su pila de navegación estarán en pantalla completa y el usuario no podrá descartarlos.

Inspector de atributos que muestra la opción de presentación para el controlador de navegación

Brandon Whitton
fuente
1

Apple compartió un código de muestra al respecto en este enlace.

Utiliza la isModalInPresentationsugerencia de tantos usuarios.

Arda Oğul Üçpınar
fuente