如何使 ScrollView 即使滚动到最后也消耗触摸事件?

How to make ScrollView consume touch event even when it's scrolled to the end?

我有一个 FSPagerView,它有一个包含可滚动条形图的项目(具有多个堆栈视图的滚动视图)。当我滚动条形图时,如果有一个可滚动的 space,则条形图会消耗触摸事件并滚动。如果一侧没有可滚动的 space,并且我一直滚动到触摸条形图的那一侧,它不再消耗触摸事件,而是整个 FSPagerView 滚动。即使在这种情况下,如何让 scrollview 消耗触摸事件?简而言之,我不想在触摸条形图时滚动 FSPagerView

这是一个视频: https://streamable.com/kuxta

你可以尝试操作UIScrollView的手势识别器:

scrollView.panGestureRecognizer

我从来没有用 UIScrollView 的 panGestureRecognizer 测试过它,但一般的想法是 将手势识别器添加到 FSPagerView 并设置该识别器和 panGestureRecognizer 之间的关系(使用 UIGestureRecognizer 的委托)以防止它触发

您可以使用 require(toFail:) 方法对两个滚动视图的 UIGestureRecognizer 进行优先排序。

这是我试过的代码:

scrollView.panGestureRecognizer.require(toFail: collectionView.panGestureRecognizer)

我不知道这是否正是您要找的。一旦 collectionView.panGestureRecognizer 检测到某些东西,滚动视图将不会滚动。

FSPagerView 暴露了 panGestureRecognizer 本质上是底层 UICollectionViewpanGestureRecognizer.

我认为您可以在看到条形图时将其禁用。

不太熟悉FSPagerView,但我认为您可以通过监视FSPagerViewDelegate 回调来检测您在哪个页面中。例如,如果条形图位于第一页(即索引 == 0),您可能可以这样做。

override func pagerView(_ pagerView: FSPagerView, willDisplay cell: FSPagerViewCell, forItemAt index: Int) {
    // FSPagerView's gesture recognizer is only enabled for index > 0.
    pagerView.panGestureRecognizer.isEnabled = (index != 0)
}

如果那个回调不起作用,我会用 func pagerView(_ pagerView: FSPagerView, didSelectItemAt index: Int) 回调尝试同样的事情。