如何使 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
本质上是底层 UICollectionView
的 panGestureRecognizer
.
我认为您可以在看到条形图时将其禁用。
不太熟悉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)
回调尝试同样的事情。
我有一个 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
本质上是底层 UICollectionView
的 panGestureRecognizer
.
我认为您可以在看到条形图时将其禁用。
不太熟悉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)
回调尝试同样的事情。