实现 SwiftUI ScrollView 对齐放置行为(可能使用“scrollViewWillEndDragging”等效项)?

问题描述 投票:0回答:1

有一种使用

UICollectionView
处理滚动的常用方法,这样当用户停止滚动时,它会逐渐减慢并停止,并且集合视图中最近的项目与集合视图边界的边缘对齐。

这与页面视图的不同之处在于,用户可以通过一次滑动快速滚动连接视图中的多个项目,并且多个项目会同时显示在屏幕上。

你可以在 Apple 自己的应用程序中看到这一点:电视、音乐、书籍和播客在每个应用程序中浏览水平列表时都表现出这种行为。

使用

UICollectionView
(或
UIScrollView
,但它在集合视图中更典型)这通常使用
scrollViewWillEndDragging(scrollView:velocity:targetContentOffset:)
方法来实现,以检测用户何时停止滚动并为其提供更新的目标偏移量以滚动到。

以下问题的最佳答案(由 rob mayoff 提供)详细描述了这一点:

如何像App Store一样将水平分页捕捉到多行集合视图?

我的问题:如何使用 SwiftUI 的 ScrollView 执行此操作?

我有一个水平滚动视图,其中包含一个 HGrid,其中包含一组项目。我想实现一个类似于 Apple 应用程序中的水平浏览器。如上所述,我可以使用 UICollectionView 来完成它,但更愿意在 SwiftUI 中“本地”完成它而不包装 UICollectionView。

我希望这可以通过 ScrollViewReader 和

scrollTo(_:anchor:)
以某种方式实现,但它似乎没有任何东西可以满足这种需求。

是否可以使用 SwiftUI 在本机实现此行为,如果可以,如何实现?

swiftui uicollectionview uiscrollview scrollview scrollviewreader
1个回答
0
投票

我能看到这个工作的唯一方法是结合使用 GeometryReader 和 ScrollReader。

您可以使用几何阅读器检测滚动位置,并使用启发式方法决定滚动何时停止,然后使用 ScrollReader 滚动到最近的元素。

但是,因为您依赖于 GeometryReader 而不是触摸事件,所以它可能不会像需要的那样流畅。

—— 另一件值得尝试的事情是将 onGesture 与 scrollView 结合起来,并用它来检测屏幕上何时没有手指。

© www.soinside.com 2019 - 2024. All rights reserved.