ScrollViewReader scrollTo 带有 .center 锚点错误?

use*_*760 13 swiftui swiftui-scrollview

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

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

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

use*_*760 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
     )
   }
}
Run Code Online (Sandbox Code Playgroud)

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