在SideMenu和UIPageViewController上拦截UIPanGestureRecognizer

时间:2016-01-20 08:21:14

标签: ios objective-c uiscrollview uipageviewcontroller uipangesturerecognizer

当向右滑动时,我显示leftMenu,并且我希望在向左滑动整页时更改标签。

他们的UIPanGestureRecognizer截获,我试过禁用UIPcViewView的UIScrollView的弹跳,试过requireGestureRecognizerToFail:

但我无法让它们都奏效。我想要的是当它被滑动到右侧菜单出现。如果侧面菜单打开则向左滑动它会关闭,否则页面会改变。

我的示例代码如下;

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

       AppDelegate *appDel = [UIApplication sharedApplication].delegate;

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

提前致谢

1 个答案:

答案 0 :(得分:0)

以下内容应该有效(警告:未经测试!)

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)];
    panRecognizer.delegate = self;

    for (UIGestureRecognizer *recognizer in self.pageViewController.gestureRecognizers)
        [recognizer requireGestureRecognizerToFail:panRecognizer];
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)recogniser
{
    if (self.leftMenuShowing)
        return YES;
    else
    {
        UIPanGestureRecognizer *panRecognizer = (id)recognizer;
        CGPoint translation = [panRecognizer translationInView:self.view];
        return (translation.x > 0);
    }
}

- (void)panRecognized:(UIPanGestureRecognizer *panRecognizer)
{
    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        // if pan is to left, move leftMenu offscreen
        // if pan is to right, move leftMenu onscreen
    }
    else
    {
        // if leftMenu is mostly onscreen, animate completely onscreen
        // if leftMenu is mostly offscreen, animate completely offscreen
    }
}