Neue modale iOS 13-Präsentation: Die Präsentation des Controllers bewegt sich nicht nach unten

11

Ich habe ein seltsames Verhalten, wenn ich UIViewController in iOS 13 modal präsentiere. Der neue Präsentationsstil, den ich in iOS 13 gesehen habe, sieht folgendermaßen aus:

Der präsentierende Ansichts-Controller wird hinter dem präsentierten Ansichts-Controller angezeigt. Es wird auch nach unten verschoben, um einen "Stapel" nachzuahmen.

Der präsentierende Ansichts-Controller wird hinter dem präsentierten Ansichts-Controller angezeigt.  Es wird auch nach unten verschoben, um einen "Stapel" nachzuahmen.

Wenn ich View Controller über meine App präsentiere, bekomme ich immer wieder diesen Effekt:

Der Präsentations-View-Controller bewegt sich beim Präsentieren eines neuen View-Controllers überhaupt nicht

Der Präsentations-View-Controller bewegt sich beim Präsentieren eines neuen View-Controllers überhaupt nicht

Ich benutze diesen Code, um diesen View Controller zu präsentieren:

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

Hier ist meine Frage: Ich frage mich, warum dies geschieht und ob es eine Möglichkeit gibt, Ansichts-Controller im normalen iOS 13-Stil darzustellen (wobei sich der präsentierende Ansichts-Controller zurückbewegt).

Danke im Voraus!

CentrumGuy
quelle
Versuchen Sie als Test, das controller.modalTransitionStyle = .coverVerticalund sogar das zu kommentieren controller.modalPresentationStyle = .pageSheet(obwohl der Präsentationsstil erforderlich wäre, wenn dieser Code auch auf einem iPad ausgeführt wird).
rmaddy
Ich habe es
auskommentiert

Antworten:

3

Es stellte sich heraus, dass das Problem meine View-Controller-Hierarchie war. Ich konnte das Problem beheben, indem ich den Presenting View Controller zum Root View Controller meiner App machte. Zuerst habe ich den Hintergrund-Controller durch Aufrufen als Root-View-Controller festgelegt

window.rootViewController = self

und dann mit meinem vorherigen Code

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

Ich stellte den View Controller vor. Vielen Dank an alle, die versucht haben zu helfen!

CentrumGuy
quelle
Ich habe das gleiche Problem. Wo haben Sie das rootViewController-Flag gesetzt? Kurz vor dem Übergang?
Paweł Zgoda-Ferchmin
Ich habe es eingestellt, als ich den "Hintergrund-Controller" vorgestellt habe. Nennen wir sie die Controller 1, 2 und 3, um die Sache zu vereinfachen (1 ist am weitesten hinten, 2 ist im Hintergrund hinter 3 und 3 ist vorne, auch bekannt als Tutorial Controller). Wir betrachten derzeit Controller 1. Anstatt present () auf Controller 1 aufzurufen, um Controller 2 zu präsentieren, habe ich Controller 2 einfach als Root-View-Controller festgelegt. Dadurch wird Controller 1 im Grunde genommen entfernt und unser Fenster hat jetzt nur Controller 2 in seiner Hierarchie. Jetzt können Sie Controller 3 normal präsentieren, indem Sie present () auf Controller 2
aufrufen
Sicher, das funktioniert bei mir, verursacht aber eine Vielzahl unterschiedlicher Probleme wie das Verschwinden der Statusleiste oder das Schneiden von Animationen während des Segues. Ich denke auch nicht, dass es sicher ist. Es muss eine bessere Lösung dafür geben ...
Paweł Zgoda-Ferchmin
Wann treten diese Probleme auf? Wann rufen Sie present () auf oder setzen Sie den Root View Controller? Die verschwindende Statusleiste kann daran liegen, dass die Statusleiste aus schwarzem Text besteht und auf einem schwarzen Hintergrund angezeigt wird, wenn present () auftritt, wodurch sie sich in den Hintergrund der Anwendung einfügt.
CentrumGuy
1
Ich habe ein einfaches Demo-Projekt erstellt. Sie können es hier ansehen : Github . Die gesamte Logik befindet sich in Controller1.swift. Lassen Sie mich wissen, ob das hilft!
CentrumGuy
1

Ich denke, das Problem kann mithilfe von vc.modalPresentationStyle = .fullScreenUINavigationController behoben werden, andernfalls können Sie diese Codes wie folgt verwenden:

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

Da dies mit iOS 13 eine neue Funktion ist, hat Apple den Standardpräsentationsstil von View Controllern in iOS 12 in ein modales Blatt vom Vollbild geändert

Apple hat die Standardeinstellung geändert
quelle
2
Mit .fullScreen sieht es aus wie in der alten iOS 12-Präsentation, in der Sie den Controller dahinter überhaupt nicht sehen können. Das ist nicht das, was ich will.
CentrumGuy
@CentrumGuy, möglicherweise sehen Sie den Link " medium.com/better-programming/… ". Er wurde ausführlich erläutert.
Apple hat den Standard
1
Ich weiß, dass Apple den Standard-Präsentationsstil in iOS 13 geändert hat. Wenn ich jedoch meine Ansichts-Controller in meiner App präsentiere, bewegt sich der Präsentations-Controller nicht wie überall sonst unter iOS 13. Sie können den Unterschied zwischen dem ersten und dem zweiten sehen Bilder in der Art und Weise, wie der präsentierende Ansichts-Controller hinter dem obersten Ansichts-Controller angezeigt wird. Ich möchte, dass meine wie das erste Bild
angezeigt wird
Es freut mich, dass ich helfen konnte!
Glotcha
1

Programmatisch:

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

Aus dem Storyboard:

Geben Sie hier die Bildbeschreibung ein

Das ist es. Sie müssen überhaupt nicht mit dem Root-Controller oder dem Fenster spielen.

Als Referenz besuchen Sie diesen Artikel .

iBug
quelle
0

Wir können es in der Inspector-Symbolleiste ändern. Um dies zu erreichen: Gehen Sie zum fünften Abschnitt der Inspector Tollbar und ändern Sie das Feld Präsentation in Vollbild.

Navin Dogiparthi
quelle
-1

Dies sollte die einzige Eigenschaft sein, die Sie festlegen müssen

presentedViewController.modalPresentationStyle = .automatic

Detailliert in https://developer.apple.com/videos/play/wwdc2019/224/

Glotcha
quelle
Das Einstellen auf automatisch scheint dieses Problem nicht zu beheben
CentrumGuy
Der Ansichts-Controller hinter dem Vordergrund-Ansichts-Controller ist derjenige, den ich als "Gegenwart" bezeichne. (Die, die Sie hinter dem Controller sehen können)
CentrumGuy
ist es die Wurzel? Sie können window.rootViewController
glotcha