插入 UIPanGestureRecognizer 以关闭具有转换类型 UIPageViewControllerTransitionStyleScroll 的 UIPageViewController

Posted

技术标签:

【中文标题】插入 UIPanGestureRecognizer 以关闭具有转换类型 UIPageViewControllerTransitionStyleScroll 的 UIPageViewController【英文标题】:Plugging UIPanGestureRecognizer to dismiss UIPageViewController with transition type UIPageViewControllerTransitionStyleScroll 【发布时间】:2013-10-03 18:36:14 【问题描述】:

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

对于解雇,我使用了一个名为 dismissPanGestureRecognizerUIPanGestureRecognizer。当 UIPageViewController 的过渡样式为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 没有任何手势识别器。看起来它是使用名为UIQueuingScrollView 的内部视图(pageViewController.view.subviews)实现的,我宁愿不要乱用它。 发生的情况是,在滚动转换类型中,在视图控制器的边界处,滚动视图只是弹跳,并且平移手势识别器永远不会因解雇而被触发。我曾尝试将 UIQueuingScrollView 的 bounces 属性设置为 NO,然后页面甚至没有改变。

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

当我到达 UIPageViewController 的边界(UIPageViewControllerDataSource 方法返回 nil),当转换样式为 UIPageViewControllerTransitionStyleScroll 时,我正在尝试寻找如何让我自己的 UIPanGestureRecognizer 被触发的方法。

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

【问题讨论】:

【参考方案1】:

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

#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");

希望这会有所帮助...

【讨论】:

感谢您的回答。这将让我知道何时关闭视图控制器,我已经能够从 PageViewController 的 dataSource 方法中获得它。但是我看不到如何使用它来插入要使用的 UIPanGestureRegocnizer 来代替 PageViewController 的 UIQueuingScrollView 使用的手势

以上是关于插入 UIPanGestureRecognizer 以关闭具有转换类型 UIPageViewControllerTransitionStyleScroll 的 UIPageViewController的主要内容,如果未能解决你的问题,请参考以下文章

UIPanGestureRecognizer 碰撞

如何在父视图中限制 UIPanGestureRecognizer

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器

Swift:获取 UIPanGestureRecognizer 的目标

当对象移动到某个帧时如何停止 UIPanGestureRecognizer