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…
… 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.
viewController.isModalInPresentation = true
(Désactivé interactif .pageSheet
le licenciement agit comme ça.)
UIViewController
contient une nouvelle propriété appelée isModalInPresentation
qui doit être définie sur true
pour empêcher le rejet interactif..popover
etc.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.
func presentationControllerShouldDismiss(_ presentationController: UIPresentationController) -> Bool {
return false
}
UIAdaptivePresentationControllerDelegate
contient une nouvelle méthode appelée presentationControllerShouldDismiss
.isModalInPresentation
est définie sur false
.Astuce: N'oubliez pas d'assigner le délégué de presentationController.
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
.
Si vous souhaitez simplement désactiver le rejet interactif et conserver le nouveau style de présentation, définissez la propriété UIViewController
isModalInPresentation
sur true
.
if #available(iOS 13.0, *) {
someViewController.isModalInPresentation = true // available in IOS13
}
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)
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
Apple a partagé un exemple de code à ce sujet sur ce lien
Il utilise isModalInPresentation
autant de suggestions d'utilisateurs.