【问题标题】:UIScrollView inside UIPageViewController: 1 and 2 finger swipe gesturesUIPageViewController 内的 UIScrollView:1 和 2 指滑动手势
【发布时间】:2014-01-24 11:13:24
【问题描述】:

结构: 我有一个 UIPageViewController,目前包含两个 UIViewController(称为例如 MenuVCImageScrollVC)。 在第二个 UIViewController(ImageScrollVC)我有一个UIScrollView。此 UIScrollView 包含多个图像。用户应该能够在图像之间滑动。

我想要

  • UIPageViewController 仅应在用户使用 两个 手指时滚动。
    ** 因此,用户可以随时用两根手指在“MenuVC”和ImageScrollVC 之间滑动。
  • UIScrollView 仅应在用户使用一根手指时滚动。
    ** 通过单指滑动手势,用户可以更改图像。

这可能吗?

我的假设是将两指滑动手势转发到底层UIPageViewController,但我不知道该怎么做。

更新

我的 ViewController 结构:

RootViewController 正在实现 UIPageViewController(与 Apple 模板完全一样)。 MenuViewController 是 PageViewController 中的第一个 ViewController,ImageScrollViewController 是第二个带有 UIScrollView 的图像。

【问题讨论】:

    标签: ios


    【解决方案1】:

    你的假设是正确的。通常嵌套的ImageScrollVC 中的UIScrollView 将处理单指和双指滑动。您可以在ImageScrollVC 中使用UIScrollView 的自定义子类来忽略两指滑动,以便它们继续向上滑动并由UIPageViewController 处理。有关详细信息,请查看此related question,下面的示例代码正是基于此。

    它的要点是你将在你的UIScrollView 子类中实现-gestureRecognizerShouldBegin:;仅当超类返回 YES 并且触摸次数为 1 时才返回 YES

    -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)recognizer
    {
        return recognizer.numberOfTouches == 1 && [super gestureRecognizerShouldBegin:recognizer];
    }
    

    【讨论】:

    • 这不起作用。 UIPageViewController 不滚动。我用我的 viewController 和视图结构的图片更新了我的问题。
    【解决方案2】:

    我想我解决了。感觉这个解决方案不是最好的或最好的,但它确实有效。

    我做了什么: 我创建了一个新的UIPanGestureRecognizer 并将其添加到imageScrollView。此手势识别器具有最小值。和最大。触及 2。在此识别器的操作方法中,我启用和禁用了 imageScrollView 的滚动。

    我还创建了一个自己的UIScrollView 子类并实现了gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer 以返回YES

    在代码中

    MenuViewController:我在 pageVC 中的第一个 UIViewController。该类什么都不做(出于此问题的目的)。这只是一个占位符,可以用两根手指滑动并显示一些内容。

    RootViewController

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
    //... exactly the same code as in the Apple template
    
    //the UIPageViewController should only use 2 finger:
    for (UIView* view in [self.pageViewController.view subviews]) {
        if ([view  isKindOfClass:[UIScrollView class]]) {
            UIScrollView* scrollView = (UIScrollView*)view;
            scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
            scrollView.panGestureRecognizer.maximumNumberOfTouches = 2;
        }
    }
    

    ImageScrollViewController

    //self.scrollView is from type 'CustomScrollView'
    -(void)viewDidLoad {
      [super viewDidLoad];
      // autolayout would be nicer, but this was faster and easier for me
      self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width * _pageImages.count, self.scrollView.frame.size.height);
      //... a for loop to add all UIImageViews as a subView to self.scrollView
    
      UIPanGestureRecognizer *twoFingerPan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
      twoFingerPan.minimumNumberOfTouches = 2;
      twoFingerPan.maximumNumberOfTouches = 2;
      [self.scrollView addGestureRecognizer:twoFingerPan];
      twoFingerPan.delegate = (CarScrollView*)self.scrollView;
    }
    
    //the inner scrollView for the images should not scroll when two fingers are active
    - (void)handlePan:(UIPanGestureRecognizer*)recognizer {
      switch (recognizer.state) {
        case UIGestureRecognizerStateBegan:
        case UIGestureRecognizerStatePossible:
            self.scrollView.scrollEnabled = NO;
            break;
    
        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateEnded:
        case UIGestureRecognizerStateFailed:
            self.scrollView.scrollEnabled = YES;
    
        default:
            break;
      }
    }
    

    CustomScrollView:我用图片为 UIScrollView 创建了一个子类。

    @interface CarScrollView : UIScrollView <UIGestureRecognizerDelegate>
    
    @implementation CarScrollView
    
    //Method has to return YES so that a two finger pan gesture will be used for the outer scrollView/pageViewController
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
      return YES;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 2012-02-17
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多