UIScrollView在滚动时取消UIPageViewController手势

时间:2012-11-05 22:56:58

标签: ios scrollview gesture uipageviewcontroller

我有UIPageViewController来处理我的“书”的翻页。但是,每个图书页面都是ViewControllerUIScrollViewsubview。由于UIScrollViewcontentSize只能垂直滚动。问题是,当用户垂直滚动scrollview时,由于scrollview仍在滚动/减速,用户无法翻页。一种非常简单的方法是滚动页面,然后尝试点击视图的边缘。这通常会更改页面,并且在scrollview未移动时确实会更改页面。但是,当它移动时,水龙头会使滚动视图停止移动而不是翻页。

如果scrollviews尝试使用手势通过点击或平移页面来翻页来导致翻页动画,如何取消UIPageViewController手势?

有关我想要实现的行为的示例,请查看iPhone上的Twitter官方客户端。 当Feed仍然从滚动减速时,可以从时间轴滑动到发现。

3 个答案:

答案 0 :(得分:1)

UIScrollView滚动事件将阻止其他UIView动画,因此在Twitter的情况下,他们可能会在滑动视图之前一瞬间取消滚动。正如你在问题中提到的那样:

“如果UIPageViewController尝试使用手势通过点击或平移页面来翻页以导致翻页动画,如何取消滚动视图手势?”

我会建议一个解决方法。

不要依赖UIPageViewController的固有UIPanGestureRecognizer,而是在页面视图中包含您自己的UIPanGestureRecognizer,以便在页面的相应部分中检测到平移并执行在适当的方向上,新的UIPanGestureRecognizer会覆盖UIPageViewController的{​​{1}}并触发必要的操作。具体来说,您需要:

(1)使用

暂停滚动动画
UIGestureRecognizer

(2)使用

以编程方式翻页
CGPoint offset = scrollView.contentOffset;
[scrollView setContentOffset:offset animated:NO];

以便停止滚动动画并在一个流体平移手势内完成翻页。

答案 1 :(得分:0)

UIGestureRecognizer类可以使用requireGestureRecognizerToFail:方法设置对其他手势识别器的依赖关系。
在您的情况下,可以使用此方法:

for (UIGestureRecognizer *gestureRecognizer in pageController.gestureRecognizers) {
    for (ViewController *viewController in viewControllers) {
        for (UIGestureRecognizer *gestureRecognizerForFail in viewController.scrollView.gestureRecognizers) {
            [gestureRecognizerForFail requireGestureRecognizerToFail:gestureRecognizer];
        }
    }
}

答案 2 :(得分:-1)

我有同样的问题,我一直在努力...在我的情况下,我有pdf启用缩放。所以我举个例子:

[scrollView setMaximumZoomScale:6];
[scrollView setMinimumZoomScale:1];

当我初始化控制器及其scrollView时,就在此之后,每次我改变方向或页面时,我都会改变缩放以适应页面的宽度,只有当缩放是“远离”

CGFloat desiredWidth = scrollView.frame.size.width/pdfRect.size.width;
if (desiredWidth>[self zoomScale]) {
    [scrollView setZoomScale:desiredWidth animated:YES];
}

我希望它有所帮助