UIPageViewController 内的 UISlider

Posted

技术标签:

【中文标题】UIPageViewController 内的 UISlider【英文标题】:UISlider inside UIPageViewController 【发布时间】: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 会立即被选中。

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

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

【问题讨论】:

【参考方案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' 的东西注册了平移手势,它什么也没做,但只是为了不将事件传播到滚动视图。

【讨论】:

以上是关于UIPageViewController 内的 UISlider的主要内容,如果未能解决你的问题,请参考以下文章

UIPageViewController 内的 UISlider

带有 UINavigationBar 的 UIPageViewController 内的 UIWebView

UIPageViewController 内的 UITableViewController,如何防止对角拖动

UIPageViewController EdgeInset 内的 UITableView 问题

uipageviewcontroller 内的 uiwebview 阻止点击翻页

无法返回 UIPageViewController 内的初始页面 ViewController