7

所以我尝试使用 ScrollViewReader 以编程方式滚动水平滚动视图。我认为它会像 UIKit 中带有 .centeredHorizo​​ntally 的 scrollToItem 一样工作,并且在大多数情况下它确实如此,但是滚动视图中的最后几个元素被强制滚动到屏幕的中心,尽管事实上滚动视图不是t 通常能够滚动那么远(至少在释放拖动后不会回弹)。这最终会在屏幕的后半部分创建空白。

我已经看到了一些关于此的其他问题,似乎普遍认为这不是错误?一方面,我想我们是在告诉滚动视图将项目居中,它就是这样做的——所以,不是错误吗?另一方面,这不是 UIKit 中类似功能的工作方式。此外,这种行为只发生在滚动视图的尾端!如果这是预期的行为,我希望使用 .center 锚滚动到滚动视图中的第一个元素会强制它进入屏幕中心并留下前导空白,但这不会发生。

有一个优雅的解决方案吗?或者我们是否必须计算元素的宽度 + 间距并根据屏幕宽度确定我们应该锚定 .center 还是只滚动到带有锚定 .trailing 的最后一个元素以复制 UIKit 行为?

4

2 回答 2

1

我可以确认这种行为并认为它应该被视为一个错误。特别是因为滚动视图将在第一次触摸事件时“跳转”到位。

从 iOS 15.4 Beta 1 开始,这对我来说是固定的。也许再试一次。

于 2022-01-31T10:38:28.847 回答
0

我发现了一个在 ScrollViewReader 发布之前制作的包(Amzd/ScrollViewProxy),它的功能与 ScrollViewReader 大致相同,但似乎也没有问题中详述的错误(如果是错误)。

使用示例可以在存储库页面上看到,但这里有一个快速的最小示例。

ScrollView(.horizontal) { scrollProxy in
    ForEach(sections) { section in
        Text(section.text)
             .scrollId(section.id)
    }
    .onChange(of: index) {
         scrollProxy.scrollTo(
               sections[index].id,
               alignment: .center
     )
   }
}

该包向 ScrollView 添加了一个方便的 init 以提供对 scrollProxy 的访问权限。

于 2021-07-25T06:31:03.980 回答