34 votes

UIPageViewController ne renvoie pas de reconnaissance des gestes dans iOS 6

J'essaie de désactiver la reconnaissance des gestes de panoramique pour un UIPageViewController.

Sous iOS 5, je peux les parcourir en boucle et les désactiver.

for (UIGestureRecognizer* recognizer in self.pageViewController.gestureRecognizers) {
    if ([recognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        recognizer.enabled = NO;
    }
}

Sous iOS 6, avec UIPageViewControllerTransitionStyleScroll, le contrôleur d'affichage de page ne renvoie aucun outil de reconnaissance des gestes.

Clarification

Cela peut se résumer à :

self.pageViewController.gestureRecognizers = 0 lorsque le style de transition de UIPageViewController est réglé sur scroll, ce qui fait que je ne peux pas accéder aux dispositifs de reconnaissance des gestes.

Y a-t-il un moyen de contourner ce problème ? Je ne pense pas faire quoi que ce soit de mal puisque la transition vers le curl fonctionne bien.

31voto

leanne Points 766

J'ai trouvé ça dans UIPageViewController.h :

// Seulement si le style de transition est 'UIPageViewControllerTransitionStylePageCurl'. @property(nonatomic, readonly) NSArray *gestureRecognizers ;

Il ne s'agit donc pas d'un bogue - par conception, le pageViewController n'obtient pas de reconnaissance des gestes lorsque le style de défilement est défini.

27voto

dstulic Points 169

Vous pouvez toujours essayer de désactiver l'interaction de l'utilisateur sur la sous-vue du contrôleur de vue de la page :

for (UIScrollView *view in self.pageViewController.view.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
        view.scrollEnabled = NO;
    }
}

26voto

sergio Points 52422

Il existe un bug déposé dans le radar pour ce comportement. Donc, je parie que tant qu'Apple ne l'aura pas corrigé, il n'y aura aucune chance de résoudre ce problème.

Une solution de contournement qui me vient à l'esprit consiste à placer une sous-vue transparente au-dessus de votre UIPageViewController et y ajouter un UIPanGestureRecognizer pour intercepter ce genre de geste et ne pas aller plus loin. Vous pourriez activer cette vue/reconnaissance lorsque la désactivation du geste est nécessaire.

J'ai essayé avec une combinaison de reconnaissances de gestes Pan et Tap et ça marche.

Voici mon code de test :

- (void)viewDidLoad {
  [super viewDidLoad];

   UIPanGestureRecognizer* g1 = [[[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(g1Pan:)] autorelease];
  [self.view addGestureRecognizer:g1];

  UITapGestureRecognizer* s1 = [[[UITapGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(g1Tap:)] autorelease];

  [self.view addGestureRecognizer:s1];

  UIView* anotherView = [[[UIView alloc]initWithFrame:self.view.bounds] autorelease];
  [self.view addSubview:anotherView];

  UIPanGestureRecognizer* g2 = [[[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                      action:@selector(g2Pan:)] autorelease];
  [anotherView addGestureRecognizer:g2];

}

Cuando g2 est activé, il empêchera g1 d'être reconnu. En revanche, il n'empêchera pas s1 d'être reconnu.

Je comprends qu'il s'agit d'un hack, mais face à un bug apparent dans UIPageViewController (du moins, le comportement réel est manifestement différent de ce que la référence indique), je ne vois pas de meilleure solution.

18voto

3rdFunkyBot Points 186

Selon le fichier d'en-tête de UIPageViewController, lorsque la source de données est nulle, la navigation par gestes est désactivée.

Donc, mettez la source de données à nil quand vous voulez désactiver le balayage, puis quand vous voulez activer le balayage, réinitialisez la source de données.

c'est-à-dire

// turns off paging
pageViewController.datasource = nil

// turns on paging
pageViewController.datasource = self;

8voto

Berni Points 61

Vous pouvez accéder à l'UIPanGestureRecognizer via l'UIScrollview du UIPageViewController.

for (UIView *view in self.pageController.view.subviews) {
    if ([view isKindOfClass:[UIScrollView class]])
    {
        UIScrollView *scrollView = (UIScrollView *)view;

        UIPanGestureRecognizer* panGestureRecognizer = scrollView.panGestureRecognizer;
        [panGestureRecognizer addTarget:self action:@selector(move:)];
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X