【问题标题】:UIScrollView cancels UIPageViewController gestures when scrollingUIScrollView 在滚动时取消 UIPageViewController 手势
【发布时间】:2012-11-05 22:56:57
【问题描述】:

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

如果UIPageViewController 试图使用手势翻页,通过点击或平移页面来产生翻页动画,我该如何取消scrollviews 手势?

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

【问题讨论】:

  • 你能分享一个包含这种情况的演示应用吗?

标签: ios scrollview gesture uipageviewcontroller


【解决方案1】:

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

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

我会建议一个解决方法。

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

(1) 停止滚动动画使用

CGPoint offset = scrollView.contentOffset;
[scrollView setContentOffset:offset animated:NO];

(2) 使用编程方式翻页

- (void)setViewControllers:(NSArray *)viewControllers direction:
  (UIPageViewControllerNavigationDirection)direction animated:
  (BOOL)animated completion:(void (^)(BOOL finished))completion;

这样滚动动画就会停止,并且在一个流畅的平移手势内完成翻页。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,我一直在努力解决......在我的情况下,我有启用缩放功能的 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];
      }
      

      希望对你有帮助

      【讨论】:

      • 嗯。有类似的问题。但是来自 Apple 的 Photoscroller 示例不需要将元素缩放回页面宽度以翻转页面。
      猜你喜欢
      • 1970-01-01
      • 2013-11-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      相关资源
      最近更新 更多