web-dev-qa-db-fra.com

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

iOS 13 introduit un nouveau design de modalPresentationStyle.pageSheet (et son frère .formSheet) pour les contrôleurs de vue présentés de façon modale…

The new sliding modal presentation in 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é "tirer pour rejeter" soit assez utile, elle n'est pas toujours souhaitable.

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

105
Jakub Truhlář

Option 1:

viewController.isModalInPresentation = true

Disabled interactive dismissal

(Désactivé interactif .pageSheet le licenciement agit comme ça.)

  • Depuis l'iOS 13, UIViewController contient une nouvelle propriété appelée isModalInPresentation qui doit être définie sur true pour empêcher le rejet interactif.
  • Il ignore essentiellement 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 aussi des styles de présentation comme .popover etc.
  • Cette propriété est false par défaut.

À partir des documents officiels: Si true, UIKit ignore les événements en dehors des limites du contrôleur de vue et empêche l'interaction fermeture du contrôleur de vue alors qu'il est à l'écran.


Option 2:

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

Astuce: N'oubliez pas d'assigner le délégué de presentationController.

158
Jakub Truhlář
  1. Si vous voulez le même comportement que dans la version iOS précédente (<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 Full Screen forme la liste déroulante Presentation.

    enter image description here

  2. Si vous souhaitez simplement désactiver le rejet interactif et conserver le nouveau style de présentation, définissez la propriété UIViewControllerisModalInPresentation sur true.

    if #available(iOS 13.0, *) {
        someViewController.isModalInPresentation = true // available in IOS13
    }
    
52
Bilal

La propriété isModalInPresentation peut vous 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 la fermeture interactive 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)
7
Mohit Tomar

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 consiste à changer la présentation du contrôleur de navigation dans l'inspecteur d'attributs d'Automatique à Plein écran. Tous les contrôleurs de vue de votre pile de navigation seront alors en plein écran et ne pourront pas être ignorés par l'utilisateur.

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

5
Brandon Whitton

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

Il utilise isModalInPresentation autant de suggestions d'utilisateurs.

1