Je me demande s'il est réellement possible d'utiliser un UIPanGestureRecognizer
sur un UIViewController
poussé pour obtenir un comportement similaire comme dans la vue de chat de Telegram Messenger (et beaucoup d'autres applications populaires), où vous pouvez simplement faire glisser votre doigt vers la droite de n'importe où sur l'écran pour revenir au menu (ou à tout autre contrôleur de vue qui a initialement poussé celui que nous recherchons).
J'ai essayé ce code:
@objc func swipeLeft(_ sender: UIPanGestureRecognizer) { let point = sender.translation(in: view) containerView.center = CGPoint(x: point.x > 0 ? view.center.x + point.x : view.center.x, y: view.center.y) if sender.state != .ended { return } if containerView.center.x < view.frame.width / 2 { dismissSelf() } else { UIView.animate(withDuration: 0.2) { self.containerView.center = self.view.center } } }
et un UIPanGestureRecognizer
, qui fonctionne bien si vous présentez
votre ViewController mais pas quand il est poussé . Du moins pas comme ça en ce moment.
En ce moment, vous voyez une vue noire et c'est aussi ce que vous voyez dans la "Debug View Hirachy" au bas d'un UIViewController poussé.
Toute aide est appréciée! p>
3 Réponses :
Je pense que ce que vous recherchez est déjà intégré à interactivePopGestureRecognizer
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true
si vous voulez créer une animation personnalisée ou différente, je pense que vous besoin de vérifier les transitions. Voici un bon article pour réaliser des transitions personnalisées: https://medium.com/swift2go/simple-custom-uinavigationcontroller-transitions- fdb56a217dd8
Mais celui-ci ne part que du bord de l'écran. Je l'ai déjà configuré, mais j'aimerais en outre pouvoir faire glisser votre doigt à partir de n'importe où sur l'écran.
si vous consultez l'article, vous pouvez gérer la transition personnalisée sur n'importe quel outil de reconnaissance de mouvement de votre choix.
Merci, je l'ai résolu en utilisant l'article! J'ai remplacé le UIScreenEdgePanGestureRecognizer par un UIPanGestureRecognizer.
Pas besoin de manipuler le mouvement de panoramique. vous pouvez simplement intégrer votre vue dans un contrôleur de navigation, et cela fournira un tel comportement (faites glisser pour revenir en arrière).
Ensuite, vous pouvez également masquer la barre de navigation si vous ne voulez pas la voir.
L'utilisateur peut également supprimer le contrôleur de vue le plus haut en utilisant le dans la barre de navigation ou à l'aide d'un geste de balayage sur le bord gauche.
https://developer.apple.com/documentation/uikit/uinavigationcontroller
// Hide the Navigation Bar self.navigationController?.setNavigationBarHidden(true, animated: animated) // Show the Navigation Bar self.navigationController?.setNavigationBarHidden(false, animated: animated)
Je viens de créer un pod pour avoir ce comportement Pan-to-pop de type Telegram / Instagram sur le contrôleur de navigation.
Vous pouvez le voir ici
Il permet à l'utilisateur de:
Pan-to-pop
normalement à partir du bord gauche (comme tout UINavigationController
normal) Pan-to-pop
à partir du centre où il n'y a pas de scrollView ou autre panGesture qui interfère Pan-top-pop
au-dessus de n'importe quel scrollView s'ils sont à offset.x = 0 (il se comporte donc comme Instagram) Tout cela en gardant toutes les fonctionnalités par défaut du contrôleur de navigation.
Pour l'installer avec CocoaPods, il suffit d'inclure le pod dans le Podfile:
pod 'EZCustomNavigation', '1.0.0'
Qu'avez-vous utilisé pour le mettre en œuvre? / Quel est le principe de base sur lequel repose votre classe personnalisée?
@ unixb0y c'est principalement une sous-classe de UINavigationController, donc tout fonctionne simplement comme celui de base, avec un animateur personnalisé (qui ressemble exactement à celui par défaut) et un mouvement de panoramique qui gère la transition interactive. Le plus dur était d'autoriser le panoramique également au-dessus de scrollView, et de distinguer quel scrollView était intégré dans mon contrôleur de navigation et lequel ne l'était pas, de permettre à quiconque de l'utiliser sans faire aucun travail. Cela se fait avec le responderChain (si mon NavigationController est dans la chaîne de répondeurs, le scrollView lui-même y est intégré). J'espère que cela t'aides.