Search code examples
iphoneobjective-cuikituipageviewcontroller

UIPageViewController returns no Gesture Recognizers in iOS 6


I am trying to disable the pan gesture recognizer for a UIPageViewController.

On iOS 5 I can loop through them and disable them.

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

On iOS 6 using UIPageViewControllerTransitionStyleScroll there are no gesture recognizers returned by the Page View Controller.

Clarification

This can be boiled down to:

self.pageViewController.gestureRecognizers = 0 when UIPageViewController's transition style is set to scroll so I can't access the gesture recognizers.

Is there any way I can get around this? I don't think I am doing anything wrong since the curl transition works fine.


Solution

  • There is a bug filed in radar for this behavior. So, I bet that until Apple fixes it there will be no chance to solve this.

    One workaround that comes to my mind is laying a transparent subview on top of your UIPageViewController and add to it a UIPanGestureRecognizer to intercept that kind of gesture and not forward further. You could enable this view/recognizer when disabling the gesture is required.

    I tried it with a combination of Pan and Tap gesture recognizers and it works.

    This is my test code:

    - (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];
    
    }
    

    When g2 is enabled, it will prevent g1 from being recognized. On the other hand, it will not prevent s1 from being recognized.

    I understand this is hack, but in the face of a seeming bug in UIPageViewController (at least, actual behavior is blatantly different from what the reference states), I cannot see any better solution.