防止 UIPageViewController 的滑动影响 UISlider

Posted

技术标签:

【中文标题】防止 UIPageViewController 的滑动影响 UISlider【英文标题】:Prevent UIPageViewController's swipe from affecting a UISlider 【发布时间】:2015-11-27 06:53:27 【问题描述】:

我在其他领域看到过这个问题,但在我的情况下没有一个答案有效。我有一个 UIPageViewController,它有一个包含 UISlider 的子视图控制器。

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

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

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

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

【问题讨论】:

【参考方案1】:

您可以将UIPanGestureRecognizer 添加到滑块,并将cancelsTouchesInView 属性添加到false 以避免UIPageViewController 在拖动滑块时滑动:

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

【讨论】:

【参考方案2】:

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

【讨论】:

这似乎也是 Apple 所相信的,因为当它是滚动页面视图控制器时,它们不提供访问权限。如果没有人可以解决问题,我会将其标记为答案,但我想有办法做到这一点。作为消费者,我觉得我应该能够使用滑块,并在其他任何地方滑动以更改页面。

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

uipageviewcontroller 中的 Swift uipageviewcontroller

如何从属于 UIPageViewController 的 UIViewController 之一更改 UIPageViewController?

UIPageViewController - 不符合协议

UIPageViewController 方向只向前

NavigationController 中的 UIPageViewController

UIPageViewController 和 UIScrollView