插入UIPanGestureRecognizer以使用转换类型UIPageViewControllerTransitionStyleScroll解除UIPageViewController

时间:2013-10-03 18:36:15

标签: iphone objective-c uiview uipageviewcontroller uipangesturerecognizer

我使用UIPageViewController滚动浏览某些视图控制器。但是,我需要在视图控制器数组的开头和结尾忽略UIPageViewController,即,如果在滚动浏览页面视图控制器时,如果我们已到达视图控制器数组的边界,则关闭视图控制器

对于解雇,我使用名为UIPanGestureRecognizer的{​​{1}}。当UIPageViewController的过渡样式为dismissPanGestureRecognizer时,这非常有效。在这种情况下,我可以这样连接我的手势 -

UIPageViewControllerTransitionStylePageCurl中的

viewDidLoad

对于[pageViewController.gestureRecognizers enumerateObjectsUsingBlock:^(UIGestureRecognizer *gR, NSUInteger idx, BOOL *stop){ gR.delegate = self; [dismissPanGestureRecognizer requireGestureRecognizerToFail:gR]; }]; self.view.gestureRecognizers = self.pageViewController.gestureRecognizers; 方法,它是这样的 -

UIGestureRecognizerDelegate

到目前为止一切顺利。如果它是一个平移手势,我们只有在页面视图控制器手势不感兴趣时​​才使用它。

转换样式为- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { // If we are at the left boundary and this is a pan gesture going right-left, // return NO // Else If we are at the right boundary and this is a pan gesture going left-right, // return NO // Else return YES } 时会出现问题。在这种情况下,UIPageViewControllerTransitionStyleScroll没有任何手势识别器。它看起来像是使用一个名为UIPageViewController的内部视图(pageViewController.view.subviews)来实现的,我宁愿不去处理它。 会发生的是,在滚动转换类型中,在视图控制器的边界处,滚动视图会反弹,并且平移手势识别器永远不会被解雇。我曾尝试将UIQueuingScrollView的UIQueuingScrollView属性设置为NO,然后页面甚至没有更改。

接下来,我尝试在bounces视图的顶部添加一个透明的UIView,然后在其上实现UIPageViewController,以为只有当它不在时才会将事件转发到pageViewController边界。但是虽然它确实可以控制何时允许页面转动,但它也会阻止其他手势传递给pageController视图(例如点击按钮等)。

当我到达UIPageViewController的边界时(UIPageViewControllerDataSource方法返回hitTest:withEvent:),当转换样式为nil时,我试图找到如何让我自己的UIPanGestureRecognizer被触发的方法。

我目前正在iOS6 / iOS7上进行测试。

1 个答案:

答案 0 :(得分:0)

您可以通过对currentPageIndex对象或实现其UIPageViewController的对象中跟踪的datasource属性做出反应来达到预期效果。检查此属性并在其中一个currentPageIndex == 0 || n-1委托方法(可能是下面两个方法中的后一个)中UIPageViewController处理解雇:

#pragma mark - UIPageViewController Delegate

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers
{
    NSLog(@"will transition");
}

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
    NSLog(@"did finish animating");
}

希望这会有所帮助......