In iOS 13 gibt es ein neues Verhalten für den Modal View Controller, wenn er angezeigt wird.
Jetzt ist es standardmäßig nicht mehr Vollbild und wenn ich versuche, nach unten zu rutschen, schließt die App den View Controller einfach automatisch.
Wie kann ich dieses Verhalten verhindern und zum alten modalen Vollbild-VC zurückkehren?
Vielen Dank
ios
viewcontroller
modalviewcontroller
ios13
Pascalbros
quelle
quelle
fullScreen
Option sollte standardmäßig aktiviert sein, um Änderungen an der Benutzeroberfläche zu verhindern.isModalInPresentation
diese Option, um zu verhindern, dass die Wischgeste geschlossen wird. Weitere Informationen finden Sie in meinem Blog-Beitrag: medium.com/@hacknicity/….automatic
Stil hat sich als Standardstil etabliert, der (für die meisten View Controller) der.pageSheet
Stil ist. Einige Systemansichts-Controller können es jedoch einem anderen Stil zuordnen.Ich füge eine Information hinzu, die für jemanden nützlich sein könnte. Wenn Sie einen Storyboard-Übergang haben, müssen Sie die Eigenschaft kind auf Modally Present und die Presentation- Eigenschaft auf Full Screen setzen, um zum alten Stil zurückzukehren .
quelle
performSegue
. Danke, Schatz!Ich hatte dieses Problem in der ersten Ansicht direkt nach dem Startbildschirm. Die Lösung für mich, da ich keinen Abschnitt oder keine Logik definiert hatte, bestand darin, die Präsentation wie hier gezeigt von automatisch auf Vollbild umzustellen:
quelle
Es gibt mehrere Möglichkeiten, dies zu tun, und ich denke, jede könnte für ein Projekt passen, aber nicht für ein anderes. Deshalb dachte ich, ich werde sie hier behalten, vielleicht läuft jemand anderes zu einem anderen Fall.
1- Vorhanden überschreiben
Wenn Sie eine haben
BaseViewController
, können Sie diepresent(_ viewControllerToPresent: animated flag: completion:)
Methode überschreiben .Auf diese Weise müssen Sie bei keinem
present
Aufruf Änderungen vornehmen, da wir diepresent
Methode einfach überschrieben haben .2- Eine Erweiterung:
Verwendungszweck:
3- Für einen UIViewController
4- Vom Storyboard
Wählen Sie einen Abschnitt aus und stellen Sie die Präsentation auf ein
FullScreen
.5- Swizzling
Verwendung: Fügen Sie
in Ihrem
AppDelegate
Innerenapplication(_ application: didFinishLaunchingWithOptions)
diese Zeile hinzu:Auf diese Weise müssen Sie bei keinem aktuellen Aufruf Änderungen vornehmen, da wir die aktuelle Methodenimplementierung zur Laufzeit ersetzen.
Wenn Sie wissen müssen, was schwirrt, können Sie diesen Link überprüfen: https://nshipster.com/swift-objc-runtime/
quelle
Ich habe Swizzling für iOS 13 verwendet
dann setzen Sie dies
irgendwo
Zum Beispiel in AppDelegate
quelle
static let
ist faul, du musst es lesen, um es berechnen zu lassen, fauler var nur einmal berechnet, ich benutze es, um zu garantieren, dass das Swizzling einmal aufgerufen wirdFür Objective-C-Benutzer
Verwenden Sie einfach diesen Code
Oder wenn Sie es speziell in iOS 13.0 hinzufügen möchten, verwenden Sie
quelle
Einzeiler:
modalPresentationStyle
muss auf dem Navigationscontroller eingestellt werden, der angezeigt wird .Getesteter Code
modalPresentationStyle muss bei navigationController festgelegt werden .
quelle
Als Hinweis: Wenn Sie Präsens an a
ViewController
senden, das in a eingebettet istNavigationController
, müssen Sie dasNavigationController
auf.fullScreen
und nicht das VC setzen.Sie können dies wie @davidbates oder programmgesteuert (wie @pascalbros) tun.
Ein Beispielszenario:
quelle
Ich musste beides tun:
Legen Sie den Präsentationsstil als Vollbild fest
Legen Sie die obere Leiste als durchscheinende Navigationsleiste fest
quelle
modalPresentationStyle
Vor dem Präsentieren ändernquelle
Hier ist eine einfache Lösung, ohne eine einzelne Zeile zu codieren.
Durch diese Änderung wird das Verhalten der iPad-App wie erwartet ausgeführt, andernfalls wird der neue Bildschirm in der Mitte des Bildschirms als Popup angezeigt.
quelle
Wenn Sie einen UITabController mit Bildschirmen mit eingebetteten Navigationscontrollern haben, müssen Sie die UITabController- Präsentation auf Vollbild einstellen, wie in der Abbildung unten gezeigt
quelle
Hier ist die Lösung für Objective-C
quelle
Neueste für iOS 13 und Swift 5.x.
quelle
Hier ist meine Version von Fix in ObjectiveC unter Verwendung von Kategorien. Bei diesem Ansatz haben Sie das Standardverhalten von UIModalPresentationStyleFullScreen, bis ein anderes explizit festgelegt wird.
quelle
Alle anderen Antworten sind ausreichend, aber für ein großes Projekt wie das unsere und für Navigationen sowohl im Code als auch im Storyboard ist dies eine ziemlich entmutigende Aufgabe.
Für diejenigen, die Storyboard aktiv nutzen. Dies ist mein Rat: Verwenden Sie Regex.
Das folgende Format eignet sich nicht für Vollbildseiten:
Das folgende Format eignet sich für Vollbildseiten:
Der folgende mit VS CODE kompatible reguläre Ausdruck konvertiert alle Seiten im alten Stil in Seiten im neuen Stil. Möglicherweise müssen Sie Sonderzeichen vermeiden, wenn Sie andere Regex-Engines / Texteditoren verwenden.
Suche Regex
Regex ersetzen
quelle
Anfangs ist der Standardwert
fullscreen
für modalPresentationStyle, in iOS 13 werden jedoch Änderungen an der vorgenommenUIModalPresentationStyle.automatic
.Wenn Sie die Vollbild-View - Controller machen wollen , müssen Sie das ändern
modalPresentationStyle
zufullScreen
.Weitere Informationen finden Sie in der
UIModalPresentationStyle
Apple-Dokumentation und in den Richtlinien für die Benutzeroberfläche von Apple, wo welche Modalität verwendet werden soll.quelle
Sie können dies ganz einfach tun. Öffnen Sie Ihr Storyboard als Quellcode und suchen Sie
kind="presentation"
in allen Seague-Tags mit kind = Präsentation ein zusätzliches AttributmodalPresentationStyle="fullScreen"
quelle
// Wenn Sie das Wischen deaktivieren möchten, um es zu schließen, fügen Sie eine Zeile hinzu
Weitere Informationen finden Sie im Apple-Dokument .
quelle
Ich habe es mit der Methode Swizzling (Swift 4.2) erreicht:
So erstellen Sie eine UIViewController-Erweiterung wie folgt
und in AppDelegate in der Anwendung: didFinishLaunchingWithOptions: Rufen Sie den Swizzling-Code auf, indem Sie Folgendes aufrufen:
quelle
Das hat bei mir funktioniert:
yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
quelle
Erstellen Sie eine Kategorie für UIViewController (z. B. UIViewController + PresentationStyle). Fügen Sie den folgenden Code hinzu.
quelle
Ein alternativer Ansatz besteht darin, eine eigene Basis-Viewcontroller-Komponente in Ihrer App zu haben und nur die festgelegten und erforderlichen Initialisierer mit einem grundlegenden Setup zu implementieren, etwa wie folgt:
HINWEIS : Wenn Ihr Ansichtscontroller in einem Navigationscontroller enthalten ist, der tatsächlich modal dargestellt wird, sollte der Navigationscontroller das Problem auf dieselbe Weise angehen (dh Ihre benutzerdefinierte Navigationscontrollerkomponente muss auf dieselbe Weise angepasst werden
Getestet auf Xcode 11.1 unter iOS 13.1 und iOS 12.4
Ich hoffe es hilft
quelle
Ich hatte dieses Problem mit einem Video, das nicht mehr im Vollbildmodus angezeigt wird. Fügte diese Zeile hinzu, die den Tag rettete :-)
quelle
Die einfachste Lösung, die für mich funktioniert hat.
quelle
Wenn Sie einen UINavigationController verwenden und einen ViewController als Root-View-Controller einbetten, treten ebenfalls dieselben Probleme auf. Verwenden Sie folgenden Code, um zu überwinden.
quelle
Anstatt
self.modalPresentationStyle = .fullScreen
jeden View Controller aufzurufen, können Sie UIViewController in Unterklassen unterteilen und einfachMyViewController
überall verwenden.quelle
Die obigen Antworten und Vorschläge sind richtig, unten ist eine andere Version und eine effiziente programmgesteuerte Verwendung.
# 1 Erstellt eine UIView-Erweiterung
# 2 Erstellt eine Methode ()
Aufruf wie unten
ODER
quelle