7
votes

Combinez UIPAGEVIEWCONTROLLATEURS SUPPORTS AVEC GESTURE DE SWIPE DE BACK-SWIPE DOS 7 UINAVIGATION

J'ai un contrôleur de navigation qui appuie un contrôleur de visualisation ( parent ) contenant un uipageviewController ( pages ). Maintenant, j'ai utilisé des gestes de panoramique / glisser pour basculer entre les enfants du contrôleur de la page. Cependant, je ne peux plus sauter le contrôleur parent -View à l'aide du geste de balayage de la bordure gauche de l'écran, car il est interprété comme un geste dans pages .

est-il possible d'accomplir ce balayage à pop lorsque le contrôleur de visualisation de gauche est montré?

Deux idées:

  1. retour nil dans pageViewController: ViewControllerbeforeViewController -> Ne fonctionne pas.

  2. restreindre la zone tactile, comme décrit ici .

    ou y a-t-il une manière plus simple?


0 commentaires

5 Réponses :


1
votes

J'ai eu un problème similaire dans l'un de mes projets et utilisé la méthode suivante. Dans mon cas, c'était l'un de ces menus côté gauche qui étaient vraiment populaires avant iOS 7.

Ma solution consistait à définir l'uoinavigationControllerdelegate, puis à mettre en œuvre les éléments suivants: xxx P> Edit:

En outre, vous avez besoin d'un crochet dans les reconnaissants de gestes de l'UIPAGEVIEWCONTROLLER. (Ils ne sont pas retournés par la propriété Gesurerecognizers pour un contrôleur de page de style de vue de la vue de défilement.) C'est gênant, mais la seule façon d'accéder à ceci est à itérer dans les reconnaissants de gestes de ScrollView et recherchez le geste de la pan. Puis définissez un pointeur et activer / désactiver si vous affichez ou non le contrôleur de vue de la vue gauche-gauche.

Si vous souhaitez conserver le bon balayage activé, puis remplacez le geste de la poêle avec un Reconnaissance de gestes de panneaux sous-classée de votre choix pouvant reconnaître conditionnellement basé sur la direction du geste de la casserole.


0 commentaires

16
votes

J'ai eu la même situation que @smallwisdom, mais la manipulée différemment.

J'ai un contrôleur d'affichage A que je pousse sur la pile de mon contrôleur de navigation. Ce contrôleur d'affichage A contient une vue de défilement horizontale qui s'étend du côté gauche de l'écran à droite.

dans ce scénario, lorsque je voulais glisser l'écran pour Pop View Controller A de la pile du contrôleur de navigation, tout ce que j'ai fini par faire était de faire défiler cette vue horizontale de défilement.

La solution est assez simple.

à l'intérieur de mon Afficher le contrôleur A , j'ai un code comme celui-ci: xxx

Ça fonctionne bien. Qu'est-ce que cela fait? Il dit aux reconnaissants de gestes de ScrollView qu'ils doivent attendre pour voir si certains autres reconnaissants de geste reconnaîtront le geste actuel.

si cela l'autre échoue Reconnaître, ils n'auront plus besoin d'attendre et ils peuvent essayer de reconnaître le geste actuel.

Si cela Autre reconnaissance réussit et reconnaît le geste actuel, puis tous les Les reconnaissants de geste qui attendaient échoueront automatiquement.

Ceci Autre reconnaissance de geste Ils doivent attendre sont définis pour être l'interactivepopgère de la navigation. Il est responsable des gestes de balayage à reviens.


1 commentaires

C'est bien! Merci! Bien que dans mon cas, le reconnaissance _ContentscrollView ne soit que 20 pts ou plus de largeur, pas en plein écran avec comme dans votre cas. Parce que j'ai beaucoup d'autres reconnaissants à l'écran qui doivent fonctionner correctement. Mais Bravo pour cette douce solution!



6
votes

Je suis surtout d'accord avec la réponse de @ Ancajic. Je tiens à fournir un cas supplémentaire lorsque vous définissez le TRANSITIONSTYLE UIPAGEVIEWCONTROLLER sur "Scroll", dans lequel vous n'obtiendrez pas que les épreuves d'accès à être définies, la solution de contournement est la suivante:

if (self.navigationController?.interactivePopGestureRecognizer != nil)
{
    for view in self.pageViewController!.view.subviews
    {
        if let scrollView = view as? UIScrollView
        {
            scrollView.panGestureRecognizer.requireGestureRecognizerToFail(self.navigationController!.interactivePopGestureRecognizer!);
        }
    }
}


1 commentaires

Une petite suggestion, utilisez une liaison optionnelle, au lieu de la ponctuelle.



1
votes

Premièrement, recherchez UIPAGEVIEWCONTROLLER'S SCROLLVIEW CODE>

override func viewDidLoad() {
    super.viewDidLoad()
    if let ges = navigationController?.interactivePopGestureRecognizer {
        pageViewController.bk_scrollView?.panGestureRecognizer.require(toFail: ges)
    }
}


0 commentaires

0
votes

Version SWIFT de la réponse de @ LCSKY:

if let interactivePopGesture = self.navigationController?.interactivePopGestureRecognizer, let pageViewController = self.swipeVC?.pageViewController {
    let subView = pageViewController.view.subviews
    for view in subView  {
        if let scrollView = view as? UIScrollView{
            scrollView.panGestureRecognizer.require(toFail: interactivePopGesture)
        }
    }    
}


0 commentaires