Une façon courante de rejeter un modal est de faire glisser vers le bas - Comment permet-on à l'utilisateur de faire glisser le modal vers le bas, s'il est assez loin, le modal est ignoré, sinon il s'anime à sa position d'origine?
Par exemple, nous pouvons le trouver utilisé sur les vues de photos de l'application Twitter ou sur le mode «découverte» de Snapchat.
Des fils similaires soulignent que nous pouvons utiliser un UISwipeGestureRecognizer et [self licenciementViewControllerAnimated ...] pour rejeter un VC modal lorsqu'un utilisateur glisse vers le bas. Mais cela ne gère qu'un seul balayage, ne laissant pas l'utilisateur faire glisser le modal.
Réponses:
Je viens de créer un tutoriel pour faire glisser interactivement un modal pour le rejeter.
http://www.thorntech.com/2016/02/ios-tutorial-close-modal-dragging/
J'ai trouvé ce sujet déroutant au début, donc le tutoriel construit cela étape par étape.
Si vous souhaitez simplement exécuter le code vous-même, voici le dépôt:
https://github.com/ThornTechPublic/InteractiveModal
Voici l'approche que j'ai utilisée:
Voir le contrôleur
Vous remplacez l'animation de rejet par une animation personnalisée. Si l'utilisateur fait glisser le modal, le
interactor
fichier démarre.Ignorer l'animateur
Vous créez un animateur personnalisé. Il s'agit d'une animation personnalisée que vous conditionnez dans un
UIViewControllerAnimatedTransitioning
protocole.Interacteur
Vous sous-classez
UIPercentDrivenInteractiveTransition
afin qu'il puisse agir comme votre machine d'état. Étant donné que les deux VC accèdent à l'objet interacteur, utilisez-le pour suivre la progression du panoramique.Contrôleur de vue modale
Cela mappe l'état du mouvement de panoramique aux appels de méthode d'interacteur. La
translationInView()
y
valeur détermine si l'utilisateur a franchi un seuil. Lorsque le mouvement de panoramique est effectué.Ended
, l'interacteur se termine ou s'annule.la source
segue
surover current context
pour éviter un écran noir à l'arrière lorsque vous abaissez le viewControllerJe vais partager comment je l'ai fait dans Swift 3:
Résultat
la mise en oeuvre
Où les contrôleurs de vue modaux héritent d'un
class
que j'ai construit (ViewControllerPannable
) pour les rendre déplaçables et rejetables lorsqu'ils atteignent une certaine vitesse.ViewControllerPannable Classe
la source
Storyboard segue
deMainViewController
surModalViewController
: définissez la propriété Presentation sur Over Current ContextVoici une solution à un fichier basée sur la réponse de @ wilson (merci 👍) avec les améliorations suivantes:
Liste des améliorations de la solution précédente
y
coordonnées deview.frame.origin
let y = max(0, translation.y)
currentPositionTouched
etoriginalPosition
minimumVelocityToHide
: quelle vitesse est suffisante pour se cacher (par défaut à 1500)minimumScreenRatioToHide
: à quel point est-il assez bas pour se cacher (0,5 par défaut)animationDuration
: à quelle vitesse masquons-nous / montrons-nous (par défaut à 0,2 s)Solution
Swift 3 et Swift 4:
la source
minimumScreenRatioToHide
)self.view.frame.origin
avant d'appelersliceViewVerticallyTo
la première fois: il semble que le décalage que nous voyons soit le même que la hauteur de la barre d'état, alors peut-être que votre origine initiale n'est pas 0?slideViewVerticallyTo
comme fonction imbriquée dansonPan
.a créé une démo pour faire glisser de manière interactive vers le bas pour ignorer le contrôleur de vue comme le mode découverte de Snapchat. Vérifiez ce github pour un exemple de projet.
la source
Swift 4.x, Utilisation de Pangesture
Manière simple
Verticale
Fonction d'assistance
Façon difficile
Référez-vous ceci -> https://github.com/satishVekariya/DraggableViewController
la source
modalPresentationStyle = UIModalPresentationOverFullScreen
pour éviter l'écran arrière derrière leview
.J'ai trouvé un moyen très simple de le faire. Mettez simplement le code suivant dans votre contrôleur de vue:
Swift 4
la source
Met à jour massivement le repo pour Swift 4 .
Pour Swift 3 , j'ai créé ce qui suit pour présenter un
UIViewController
de droite à gauche et le rejeter par un mouvement de panoramique. J'ai téléchargé ceci en tant que référentiel GitHub .DismissOnPanGesture.swift
fichier:Utilisation facile:
la source
Ce que vous décrivez est une animation de transition personnalisée et interactive . Vous personnalisez à la fois l'animation et le geste de pilotage d'une transition, c'est-à-dire le rejet (ou non) d'un contrôleur de vue présenté. Le moyen le plus simple de l'implémenter consiste à combiner un UIPanGestureRecognizer avec un UIPercentDrivenInteractiveTransition.
Mon livre explique comment faire cela, et j'ai publié des exemples (tirés du livre). Cet exemple particulier est une situation différente - la transition est sur le côté, pas vers le bas, et c'est pour un contrôleur de barre d'onglets, pas un contrôleur présenté - mais l'idée de base est exactement la même:
https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/bk2ch06p296customAnimation2/ch19p620customAnimation1/AppDelegate.swift
Si vous téléchargez ce projet et que vous l'exécutez, vous verrez que ce qui se passe est exactement ce que vous décrivez, sauf que c'est de côté: si le glissement est supérieur à la moitié, nous effectuons une transition, mais sinon, nous annulons et nous nous remettons endroit.
la source
Seul rejet vertical
la source
J'ai créé une extension facile à utiliser.
Juste inhérent à votre UIViewController avec InteractiveViewController et vous avez terminé InteractiveViewController
appelez la méthode showInteractive () depuis votre contrôleur pour l'afficher comme Interactive.
la source
En Objectif C: voici le code
dans
viewDidLoad
la source
Voici une extension que j'ai créée sur la base de la réponse @Wilson:
USAGE
À l'intérieur de votre contrôleur de vue, vous voulez pouvoir faire glisser:
et il sera rejeté en faisant glisser depuis le côté extrême gauche du contrôleur de vue, en tant que contrôleur de navigation.
la source
C'est ma classe simple pour faire glisser ViewController à partir de l'axe . Juste hérité de votre classe de DraggableViewController.
Fonctionne uniquement pour ViewController présenté.
la source
Pour ceux qui veulent vraiment plonger un peu plus dans la transition personnalisée UIViewController, je recommande cet excellent tutoriel de raywenderlich.com .
Le projet d'exemple final d'origine contient un bogue. Je l'ai donc corrigé et l'ai téléchargé dans le dépôt Github . Le projet est dans Swift 5, vous pouvez donc l'exécuter et le jouer facilement.
Voici un aperçu:
Et c'est aussi interactif!
Bon piratage!
la source
Vous pouvez utiliser un UIPanGestureRecognizer pour détecter le glissement de l'utilisateur et déplacer la vue modale avec lui. Si la position de fin est suffisamment basse, la vue peut être supprimée ou animée à sa position d'origine.
Consultez cette réponse pour plus d'informations sur la mise en œuvre de quelque chose comme celui-ci.
la source