Désactiver le rejet interactif du contrôleur de vue présenté dans iOS 13

135

iOS 13 introduit une nouvelle conception de modalPresentationStyle .pageSheet(et son frère .formSheet) pour les contrôleurs de vue à présentation modale…

La nouvelle présentation modale coulissante dans iOS 13

… Et nous pouvons ignorer ces feuilles en faisant glisser le contrôleur de vue présenté vers le bas (rejet interactif) . Bien que la nouvelle fonctionnalité "Pull-to-Ignorer" soit assez utile, elle n'est pas toujours souhaitable.

LA QUESTION: Comment désactiver le rejet interactif? - Gardez à l'esprit que nous gardons le même style de présentation.

Jakub Truhlář
la source
4
Copie
6
@MehulThakkar C'est une autre question.
Jakub Truhlář

Réponses:

240

Option 1:

viewController.isModalInPresentation = true

Renvoi interactif désactivé

(Le .pageSheetrenvoi interactif désactivé agit comme ceci.)

  • Depuis l'iOS 13, UIViewControllercontient une nouvelle propriété appelée isModalInPresentationqui doit être définie sur truepour empêcher le renvoi interactif.
  • Il ignore fondamentalement les événements en dehors des limites du contrôleur de vue. Gardez cela à l'esprit si vous utilisez non seulement le style automatique, mais également des styles de présentation tels que.popover etc.
  • Cette propriété est falsepar défaut.

À partir de la documentation officielle : Si true, UIKit ignore les événements en dehors des limites du contrôleur de vue et empêche le rejet interactif du contrôleur de vue lorsqu'il est à l'écran.


Option 2:

func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
    return false
}
  • Depuis l'iOS 13, UIAdaptivePresentationControllerDelegatecontient une nouvelle méthode appeléepresentationControllerShouldDismiss .
  • Cette méthode est appelée uniquement si le contrôleur de vue présenté n'est pas ignoré par programme et que sa isModalInPresentationpropriété est définie sur false.

Conseil: n'oubliez pas d'attribuer le délégué de presentationController.

Jakub Truhlář
la source
2
Si le contrôleur de vue présenté est un contrôleur de navigation, vous pouvez le définir isModalInPresentationsur le contrôleur de navigation ou sur les contrôleurs de vue individuels affichés dans la pile de navigation. Ce dernier vous permet de choisir écran par écran si le licenciement interactif est possible. Attention aux contrôleurs de recherche, ils ont priorité sur le contrôleur de vue individuel (mais pas sur le contrôleur de navigation). Plus d'informations dans mon article de blog: medium.com/@hacknicity
Geoff Hackworth
1
Gardez à l'esprit que si votre VC est présenté comme un popover, cela empêchera le popover d'être ignoré lorsque vous appuyez en dehors de celui
PatrickDotStar
4
Objective-C:viewController.modalInPresentation = YES;
quarac
3
Quelqu'un a fait fonctionner cela lors de la définition de cet indicateur sur un UIImagePickerController? Pour nous, il semble que le UIImagePickerControllersoit l'ignorer et il peut donc être rejeté avec le geste de balayage. C'est peut-être un bogue iOS 13.
PatrickDotStar
4
Lorsque presentationControllerShouldDismiss(_ presentationController: UIPresentationController)renvoie false, presentationControllerDidAttemptToDismiss(_ presentationController: UIPresentationController)est appelé pour que vous puissiez faire des choses comme ajouter une boîte de dialogue de confirmation si l'utilisateur a entré des données.
Neil
66
  1. Si vous voulez le même comportement que dans la version précédente d'iOS (<iOS13) comme la présentation du modèle en plein écran, définissez simplement le style de présentation de votre contrôleur de vue de destination sur UIModalPresentationStyle.fullScreen

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

    Et si vous utilisez le storyboard, sélectionnez simplement le segua et sélectionnez dans Full Screenla Presentationliste déroulante.

    entrez la description de l'image ici

  2. Si vous souhaitez simplement désactiver le rejet interactif et conserver la nouvelle UIViewControllerpropriété de jeu de style de présentation isModalInPresentationsur true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }
Bilal
la source
Cela fonctionne mieux que d'utiliser {controller.isModalInPresentation = true}.
Maxim Firsoff le
8

La propriété isModalInPresentationpourrait aider.

De la documentation:

Lorsque vous le définissez sur true, UIKit ignore les événements en dehors des limites du contrôleur de vue et empêche le rejet interactif du contrôleur de vue lorsqu'il est à l'écran.

Vous pouvez l'utiliser comme ceci:

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

Si vous utilisez des storyboards pour mettre en page votre interface utilisateur, j'ai trouvé que le meilleur moyen de désactiver ce rejet interactif lors de l'utilisation d'un contrôleur de navigation est de changer la présentation du contrôleur de navigation dans l'inspecteur d'attributs de automatique à plein écran. Tous les contrôleurs de vue de votre pile de navigation seront alors en plein écran et ne pourront pas être rejetés par l'utilisateur.

Inspecteur d'attributs montrant l'option de présentation pour le contrôleur de navigation

Brandon Whitton
la source
1

Apple a partagé un exemple de code à ce sujet sur ce lien

Il utilise isModalInPresentationautant de suggestions d'utilisateurs.

Arda Oğul Üçpınar
la source