防止UIPageViewController的滑动影响UISlider

时间:2015-11-27 06:53:27

标签: ios swipe uipageviewcontroller uislider pan

我在其他方面看到过这个问题但在我的案例中没有一个答案可行。我有一个UIPageViewController,它有一个包含UISlider的子视图控制器。

当您尝试移动滑块时,它会激活页面视图控制器的滚动。你必须点击,暂停滑块圆,然后移动。

UIPageViewController设置为滚动类型,因此未设置gestureRecognizers。 (标题声明“仅在过渡样式为'UIPageViewControllerTransitionStylePageCurl'时才填充”)。因此,我甚至无法正确访问手势。

我已经尝试了几件事来防止UIPageViewController影响滑块,但无济于事。我试过了: 1)走孩子子树并将UIScrollView的pan手势委托给自己(这导致崩溃) 2)在顶部添加我自己的手势,并检查y值。这将阻止滑动,但它也会吃掉水龙头并移动,因此滑块实际上不会按预期更改 3)使用自定义手势实现自定义滑块。问题是我无法匹配平移手势改变滑块同样是默认值。由于您必须自己实现平移并调整位置,因此很难匹配实际行为。

这些方法都不适合我。有没有人能够解决这个问题?我能想到的唯一解决方案是防止一起滚动,添加左/右按钮,并相应地以编程方式转换页面。

3 个答案:

答案 0 :(得分:2)

试试这段代码:

UIPageViewController *pageViewController = self.parentViewController;

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

答案 1 :(得分:1)

您可以将UIPanGestureRecognizer添加到具有cancelsTouchesInView属性的滑块上来false,以避免在拖动滑块时滑动UIPageViewController:

let panGesture = UIPanGestureRecognizer()
panGesture.cancelsTouchesInView = false
yourSlider.addGestureRecognizer(panGesture)

答案 2 :(得分:0)

我认为最好的解决方案是重新设计UI,使其不具有UIPageViewController水平滚动/滑动的组件。用户已经习惯于在UIPageViewController的任何位置执行水平滑动,如果该行为发生变化,可能会令人感到困惑/沮丧。