Nouvelle présentation modale iOS 13: le contrôleur de présentation ne descend pas

11

J'ai un comportement étrange lors de la présentation modale d'UIViewControllers dans iOS 13. Le nouveau style de présentation que j'ai vu sur iOS 13 ressemble à ceci:

Le contrôleur de vue présenté apparaît derrière le contrôleur de vue présenté. Il est également décalé vers le bas pour imiter une "pile"

Le contrôleur de vue présenté apparaît derrière le contrôleur de vue présenté.  Il est également décalé vers le bas pour imiter une "pile"

Pendant ce temps, lorsque je présente des contrôleurs de vue via mon application, j'obtiens toujours cet effet:

Le contrôleur de vue de présentation ne bouge pas du tout lors de la présentation d'un nouveau contrôleur de vue

Le contrôleur de vue de présentation ne bouge pas du tout lors de la présentation d'un nouveau contrôleur de vue

J'utilise ce code pour présenter ce contrôleur de vue:

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

Voici ma question: je me demande pourquoi cela se produit et s'il existe un moyen de présenter les contrôleurs de vue dans le style iOS 13 normal (avec le contrôleur de vue de présentation qui recule).

Merci d'avance!

CentrumGuy
la source
À titre de test, essayez de commenter le controller.modalTransitionStyle = .coverVerticalet même le controller.modalPresentationStyle = .pageSheet(bien que le style de présentation soit nécessaire si ce code est également exécuté sur un iPad).
rmaddy
Je l'ai commenté mais cela ne change rien :(
CentrumGuy

Réponses:

3

Il s'avère que le problème était ma hiérarchie de contrôleur de vue. J'ai pu y remédier en faisant du contrôleur de vue de présentation le contrôleur de vue racine de mon application. J'ai d'abord défini le contrôleur d'arrière-plan comme contrôleur de vue racine en appelant

window.rootViewController = self

puis en utilisant mon code précédent

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

J'ai présenté le contrôleur de vue. Merci à tous ceux qui ont essayé d'aider!

CentrumGuy
la source
Je rencontre le même problème. Où avez-vous défini l'indicateur rootViewController? Juste avant la séquence?
Paweł Zgoda-Ferchmin
Je l'ai réglé lorsque j'ai présenté le "contrôleur d'arrière-plan". Appelons-les contrôleurs 1, 2 et 3 pour faciliter les choses (1 étant le plus éloigné à l'arrière, 2 étant à l'arrière-plan derrière 3 et 3 étant celui à l'avant alias le Tutorial Controller). Nous examinons actuellement le contrôleur 1. Au lieu d'appeler present () sur le contrôleur 1 pour présenter le contrôleur 2, je viens de définir le contrôleur 2 comme contrôleur de vue racine. Cela élimine fondamentalement le contrôleur 1 et notre fenêtre n'a maintenant que le contrôleur 2 dans sa hiérarchie. Maintenant, vous pouvez présenter le contrôleur 3 normalement en appelant present () sur le contrôleur 2.
CentrumGuy
Bien sûr, cela fonctionne pour moi mais provoque une variété de problèmes différents comme la disparition de la barre d'état ou la découpe d'animation pendant la séquence, je ne pense pas non plus que ce soit sûr. Il doit y avoir une meilleure solution à cela ...
Paweł Zgoda-Ferchmin
Quand ces problèmes surviennent-ils? Lorsque vous appelez present () ou lorsque vous définissez le contrôleur de vue racine? La barre d'état qui disparaît pourrait être due au fait que la barre d'état est en texte noir et apparaît sur un fond noir lorsque le présent () se produit, ce qui la fait se fondre dans l'arrière-plan de l'application.
CentrumGuy
1
J'ai créé un projet de démonstration simple. Vous pouvez le regarder ici: github . Toute la logique est dans Controller1.swift. Faites-moi savoir si cela aide!
CentrumGuy
1

Je pense que le problème peut être résolu en utilisant vc.modalPresentationStyle = .fullScreens'il n'y a pas UINavigationController, sinon vous pouvez utiliser ces codes comme suit:

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

car avec iOS 13, c'est une nouvelle fonctionnalité qu'Apple a changé le style de présentation par défaut des contrôleurs de vue en une feuille modale en plein écran dans iOS 12

Apple a changé la valeur par défaut
la source
2
.fullScreen le fait ressembler à l'ancienne présentation iOS 12 où vous ne pouvez pas voir le contrôleur derrière tout cela. Ce n'est pas ce que je veux.
CentrumGuy
@CentrumGuy, vous pouvez voir le lien " medium.com/better-programming/… ", il a été expliqué en détail.
Apple a modifié le
1
Je sais qu'Apple a changé le style de présentation par défaut dans iOS 13. Cependant, lorsque je présente mes contrôleurs de vue dans mon application, le contrôleur de présentation ne bouge pas comme partout ailleurs sur iOS 13. Vous pouvez voir la différence entre le premier et le second images de la façon dont le contrôleur de vue de présentation est affiché derrière le contrôleur de vue le plus haut. Je veux que le mien s'affiche comme la première image
CentrumGuy
Je suis heureux d'avoir pu aider!
glotcha
1

Par programme:

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

Du storyboard:

entrez la description de l'image ici

C'est ça. Pas besoin de jouer avec le contrôleur racine ou la fenêtre.

Pour référence, visitez cet article .

iBug
la source
0

Nous pouvons le changer dans la barre d'outils de l'inspecteur. Pour y parvenir: dirigez-vous vers la cinquième section de la barre de contrôle de l'inspecteur, puis changez le champ Présentation en plein écran.

Navin Dogiparthi
la source
-1

Cela devrait être la seule propriété que vous devez définir

presentedViewController.modalPresentationStyle = .automatic

Détaillé dans https://developer.apple.com/videos/play/wwdc2019/224/

glotcha
la source
Le paramétrer sur automatique ne semble pas résoudre ce problème
CentrumGuy
Le contrôleur de vue derrière le contrôleur de vue de premier plan est celui que j'appelle le "présent". (Celui que vous pouvez voir derrière le contrôleur)
CentrumGuy
est-ce la racine? vous pouvez vérifier window.rootViewController
glotcha