UIPageViewController捕获所有UITapGestureRecognizer事件

时间:2012-08-23 00:14:45

标签: objective-c uiview addsubview uipageviewcontroller uitapgesturerecognizer

在键盘上度过了漫长的一天,所以我伸出手: - )

我在典型的实现中有UIPageViewController,基本上遵循Apple的标准模板。我正在尝试添加一个叠加层,允许用户执行操作,例如触摸按钮跳转到某些页面或关闭视图控制器以转到应用程序的其他部分。

我的问题是UIPageViewController正在从我的叠加子视图中捕获所有事件,而我正在努力寻找可行的解决方案。

以下是一些帮助该示例的代码...

在viewDidLoad

// Page creation, pageViewController creation etc....

self.pageViewController.delegate = self;

[self.pageViewController setViewControllers:pagesArray
                                  direction:UIPageViewControllerNavigationDirectionForward
                                   animated:NO
                                completion:NULL];

self.pageViewController.dataSource = self;

[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];

// self.overlay being the overlay view

if (!self.overlay) 
{
   self.overlay = [[MyOverlayClass alloc] init];  // Gets frame etc from class init
   [self.view addSubview:self.overlay];
}

这一切都很棒。叠加层被创建,它会像您期望的那样显示在UIPageViewController页面的顶部。当页面翻转时,它们会在叠加层下方翻转 - 再次正如您所期望的那样。

但是,UIButtons视图中的self.overlay永远不会获得点击事件。 UIPageViewController响应所有事件。

我已尝试按照此处的建议覆盖-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch但未成功。

UIPageViewController Gesture recognizers

我试过手动捕获所有事件并自己处理它们 - 不起作用(说实话,即使这样做看起来有点像黑客)。

是否有人建议如何捕捉事件,或者更好的方法在UIPageViewController的顶部使用叠加层。

非常感谢任何和所有帮助!!

2 个答案:

答案 0 :(得分:3)

尝试迭代UIPageViewController.GestureRecognizers并指定self作为这些动作的委托并实施

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

您的代码可能是这样的:

在viewDidLoad

for (UIGestureRecognizer * gesRecog in self.pageViewController.gestureRecognizers)
{
        gesRecog.delegate = self;
}

并添加以下方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view != self.pageViewController.view]
    {
        return NO;
    }
    return YES;
}

答案 1 :(得分:0)

阻止UIPageViewController滚动的文档化方法是不分配dataSource属性。如果您分配数据源,它将进入“基于手势”的导航模式,这是您要阻止的。

如果没有数据源,您可以使用setViewControllers:direction:animated:completion方法手动提供视图控制器,并且它将根据需要在视图控制器之间移动。

上述内容可以从Apple's documentation of UIPageViewController(概述,第二段)推断出来:

  

要支持基于手势的导航,您必须使用数据源对象提供视图控制器。

相关问题