Ein üblicher Weg, ein Modal zu schließen, besteht darin, nach unten zu streichen. Wie können wir dem Benutzer erlauben, das Modal nach unten zu ziehen, wenn es weit genug ist, wird das Modal entlassen, andernfalls wird es wieder an die ursprüngliche Position animiert?
Wir finden dies beispielsweise in den Fotoansichten der Twitter-App oder im "Discovery" -Modus von Snapchat.
Ähnliche Threads weisen darauf hin, dass wir einen UISwipeGestureRecognizer und [self EntlassungViewControllerAnimated ...] verwenden können, um eine modale VC zu schließen, wenn ein Benutzer nach unten wischt. Dies behandelt jedoch nur einen einzigen Wisch und lässt den Benutzer das Modal nicht herumziehen.
Antworten:
Ich habe gerade ein Tutorial erstellt, um ein Modal interaktiv nach unten zu ziehen, um es zu schließen.
http://www.thorntech.com/2016/02/ios-tutorial-close-modal-dragging/
Ich fand dieses Thema zunächst verwirrend, daher wird es im Tutorial Schritt für Schritt erläutert.
Wenn Sie den Code nur selbst ausführen möchten, ist dies das Repo:
https://github.com/ThornTechPublic/InteractiveModal
Dies ist der Ansatz, den ich verwendet habe:
Controller anzeigen
Sie überschreiben die Entlassungsanimation mit einer benutzerdefinierten. Wenn der Benutzer das Modal zieht, wird es
interactor
aktiviert.Animator schließen
Sie erstellen einen benutzerdefinierten Animator. Dies ist eine benutzerdefinierte Animation, die Sie in ein
UIViewControllerAnimatedTransitioning
Protokoll packen.Interaktor
Sie Unterklasse,
UIPercentDrivenInteractiveTransition
damit es als Ihre Zustandsmaschine fungieren kann. Da beide VCs auf das Interaktorobjekt zugreifen, können Sie damit den Schwenkfortschritt verfolgen.Modal View Controller
Dadurch wird der Schwenkgestenstatus Interaktormethodenaufrufen zugeordnet. Der
translationInView()
y
Wert bestimmt, ob der Benutzer einen Schwellenwert überschritten hat. Wenn die Schwenkgeste aktiviert ist.Ended
, wird der Interaktor entweder beendet oder abgebrochen.quelle
segue
auf einover current context
, um einen schwarzen Bildschirm auf der Rückseite zu vermeiden, wenn Sie den viewController herunterziehenIch werde erzählen, wie ich es in Swift 3 gemacht habe:
Ergebnis
Implementierung
Wo die Modals View Controller von einem erben
class
, den ich erstellt habe (ViewControllerPannable
) , um sie bei Erreichen einer bestimmten Geschwindigkeit zu machen.ViewControllerPannable-Klasse
quelle
Storyboard segue
desMainViewController
aufModalViewController
: Stellen Sie die Präsentation Eigenschaft Over Current ContextHier ist eine Ein-Datei-Lösung basierend auf der Antwort von @ wilson (danke 👍) mit den folgenden Verbesserungen:
Liste der Verbesserungen gegenüber der vorherigen Lösung
y
Koordinate von aktualisierenview.frame.origin
let y = max(0, translation.y)
currentPositionTouched
undoriginalPosition
minimumVelocityToHide
: Welche Geschwindigkeit reicht aus, um sich zu verstecken (standardmäßig 1500)minimumScreenRatioToHide
: Wie niedrig ist genug, um sich zu verstecken (standardmäßig 0,5)animationDuration
: Wie schnell verstecken / zeigen wir (standardmäßig 0,2 s)Lösung
Swift 3 & Swift 4:
quelle
minimumScreenRatioToHide
)self.view.frame.origin
Sie sich vielleicht den Wert von an, bevor SiesliceViewVerticallyTo
das erste Mal anrufen : Es scheint, dass der Offset, den wir sehen, mit der Höhe der Statusleiste übereinstimmt. Vielleicht ist Ihr ursprünglicher Ursprung also nicht 0?slideViewVerticallyTo
als verschachtelte Funktion in zu verwendenonPan
.hat eine Demo zum interaktiven Herunterziehen erstellt, um den View Controller wie den Erkennungsmodus von Snapchat zu schließen. Überprüfen Sie diesen Github für ein Beispielprojekt.
quelle
Swift 4.x, mit Pangesture
Einfacher Weg
Vertikale
Hilfsfunktion
Harter Weg
Siehe hierzu -> https://github.com/satishVekariya/DraggableViewController
quelle
modalPresentationStyle = UIModalPresentationOverFullScreen
, um den Rückbildschirm hinter dem zu vermeidenview
.Ich habe einen super einfachen Weg gefunden, dies zu tun. Geben Sie einfach den folgenden Code in Ihren View Controller ein:
Swift 4
quelle
Aktualisiert das Repo für Swift 4 massiv .
Für Swift 3 habe ich Folgendes erstellt, um ein
UIViewController
von rechts nach links darzustellen und es durch eine Schwenkgeste zu schließen. Ich habe dies als GitHub-Repository hochgeladen .DismissOnPanGesture.swift
Datei:Einfache Bedienung:
quelle
Was Sie beschreiben, ist eine interaktive benutzerdefinierte Übergangsanimation . Sie passen sowohl die Animation als auch die Fahrgeste eines Übergangs an, dh die Entlassung (oder nicht) eines präsentierten Ansichtscontrollers. Die einfachste Möglichkeit zur Implementierung besteht darin, einen UIPanGestureRecognizer mit einer UIPercentDrivenInteractiveTransition zu kombinieren.
In meinem Buch wird erklärt, wie das geht, und ich habe Beispiele (aus dem Buch) veröffentlicht. Dieses spezielle Beispiel ist eine andere Situation - der Übergang erfolgt seitwärts und nicht nach unten, und es handelt sich um einen Tab-Bar-Controller, nicht um einen vorgestellten Controller -, aber die Grundidee ist genau dieselbe:
https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch06p296customAnimation2/ch19p620customAnimation1/AppDelegate.swift
Wenn Sie dieses Projekt herunterladen und ausführen, werden Sie feststellen, dass genau das passiert, was Sie beschreiben, außer dass es seitwärts verläuft: Wenn der Luftwiderstand mehr als die Hälfte beträgt, wechseln wir, aber wenn nicht, brechen wir ab und rasten wieder ein Ort.
quelle
Nur vertikale Entlassung
quelle
Ich habe eine benutzerfreundliche Erweiterung erstellt.
Einfach Ihren UIViewController mit InteractiveViewController inhärent und Sie sind fertig InteractiveViewController
Rufen Sie die Methode showInteractive () von Ihrem Controller auf, um sie als interaktiv anzuzeigen.
quelle
In Ziel C: Hier ist der Code
im
viewDidLoad
quelle
Hier ist eine Erweiterung, die ich basierend auf der @ Wilson-Antwort gemacht habe:
VERWENDUNG
In Ihrem View Controller möchten Sie wischbar sein:
und es kann durch Wischen von der äußersten linken Seite des Ansichts-Controllers als Navigations-Controller verworfen werden.
quelle
Dies ist meine einfache Klasse für Drag ViewController von der Achse . Nur herited Ihre Klasse von DraggableViewController.
Arbeiten Sie nur für den präsentierten ViewController.
quelle
Für diejenigen, die wirklich etwas tiefer in Custom UIViewController Transition eintauchen möchten, empfehle ich dieses großartige Tutorial von raywenderlich.com .
Das ursprüngliche endgültige Beispielprojekt enthält einen Fehler. Also habe ich es repariert und auf Github Repo hochgeladen . Das Projekt befindet sich in Swift 5, sodass Sie es problemlos ausführen und spielen können.
Hier ist eine Vorschau:
Und es ist auch interaktiv!
Viel Spaß beim Hacken!
quelle
Sie können einen UIPanGestureRecognizer verwenden, um das Ziehen des Benutzers zu erkennen und die modale Ansicht damit zu verschieben. Wenn die Endposition weit genug unten ist, kann die Ansicht verworfen oder auf andere Weise an ihre ursprüngliche Position zurück animiert werden.
In dieser Antwort finden Sie weitere Informationen zur Implementierung von so etwas.
quelle