【问题标题】:UISlider inside UIPageViewControllerUIPageViewController 内的 UISlider
【发布时间】:2013-06-19 07:15:03
【问题描述】:

我有一个像这样初始化的 PageViewController:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
                          navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

在其中一个页面上,有一个 UISlider。

我的问题是,当我将 transitionstyle 设置为 UIPageViewControllerTransitionStyleScroll 时,在滑块上调用 beginTrackingWithTouch 之前需要 150-200 毫秒。 当我使用UIPageViewControllerTransitionStylePageCurl 时,不会出现这种行为,其中 UISlider 会立即被选中。

这意味着除非用户在拖动滑块(视频进度)之前稍等片刻,否则页面将会翻转,这远非理想。

页面卷曲动画不符合应用程序的要求,因此感谢任何解释或解决方法。

【问题讨论】:

    标签: cocoa-touch uislider uipageviewcontroller


    【解决方案1】:

    由于 UIPageViewControllerTransitionStyleScroll 手势识别器不可用,你可以使用这个:

    for (UIView *view in pageViewController.view.subviews) {
        if ([view isKindOfClass:[UIScrollView class]]) {
            UIScrollView *scrollView = (UIScrollView *)view;
            scrollView.delaysContentTouches = NO;
        }
    }
    

    【讨论】:

    • 嗨,我不明白如何使用这个解决方案......你能开发更多在哪里添加这个代码,以及为什么在 scrollView 上设置 delaysContentTouches 有效吗?谢谢
    • 您可以在创建 UIPageViewController 后将此代码放在下一行。或者您可以继承 UIPageViewController 并将此代码放在 viewDidLoad 方法中,只需使用“self”而不是“pageViewController”。当“delaysContentToushes”为“NO”时,滚动视图会立即将触摸转发到内容,并且不会在内容处理触摸之前尝试执行滚动
    • 感谢您的解释。这对我来说好一点,但是 pageViewController 仍然首先对滑块的触摸做出反应。
    • swift3: for view in view.subviews { if view is UIScrollView { (view as! UIScrollView).delaysContentTouches = false } }
    • 斯威夫特 4:for view in pageVC.view.subviews { if let scrollView = view as? UIScrollView { scrollView.delaysContentTouches = false } }
    【解决方案2】:

    我通过在 UISlider 上添加平移手势并设置解决了这个问题:

    self.sliderGesture.cancelsTouchesInView = NO;  // make touch always triggered
    

    并实现委托方法,如:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        return otherGestureRecognizer.view.superview == self.parentViewController.view;
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        // only receive touch in slider
        CGPoint touchLocation = [touch locationInView:self.view];
        return CGRectContainsPoint(self.slider.frame, touchLocation);
    }
    

    【讨论】:

      【解决方案3】:

      您可以尝试将页面视图控制器手势的委托设置为根视图控制器:

      for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers) {
          gestureRecognizer.delegate = self;
      }
      

      如果手势出现在 UIControl 的子类 UISlider 中,则阻止手势的触摸:

      - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
          return ([touch.view isKindOfClass:[UIControl class]] == NO); 
      }
      

      【讨论】:

      • 问题是当transitionstyle= UIPageViewControllerTransitionStyleScroll时没有设置手势识别器,因此这个问题:link
      【解决方案4】:

      对我有帮助的是将 pan-gesture-recognizer 添加到包含 UISlider 的 UIView 中,所以最后我有了 UIPageViewController->UIScrollView->...->MyView->UISlider 'MyView' 的东西注册了平移手势,它什么也没做,但只是为了不将事件传播到滚动视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多