ScrollViewReader scrollTo 带有 .center 锚点错误?
ScrollViewReader scrollTo with .center anchor bug?
所以我尝试使用 ScrollViewReader 以编程方式滚动水平滚动视图。我认为它会像 UIKit 中带有 .centeredHorizontally 的 scrollToItem 一样工作,并且在大多数情况下它确实如此,但是滚动视图中的最后几个元素被强制滚动到屏幕中心,尽管滚动视图不是'通常无法滚动那么远(至少在释放拖动后不会弹回)。这最终会在屏幕的后半部分创建白色 space。
我看到了其他一些关于此的问题,似乎普遍认为这不是错误?一方面,我想我们是在告诉滚动视图将项目居中,它就是这样做的——所以,这不是错误吗?另一方面,这不是 UIKit 中类似功能的工作方式。此外,这种行为只发生在滚动视图的尾端!如果这是预期的行为,我希望使用 .center 锚点滚动到滚动视图中的第一个元素会强制它进入屏幕中心并留下前导白色 space,但这不会发生。
有什么优雅的解决方法吗?或者我们是否必须计算元素的宽度 + 间距并根据屏幕宽度确定我们是应该锚定 .center 还是滚动到最后一个带有锚定 .trailing 的元素以复制 UIKit 行为?
我找到了一个包(Amzd/ScrollViewProxy),它是在 ScrollViewReader 发布之前制作的,其功能与 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 的访问。
我可以确认此行为并认为它应该被视为一个错误。特别是因为滚动视图会在第一次触摸事件时“跳”到位。
从 iOS 15.4 Beta 1 开始,这对我来说是固定的。也许再试一次。
所以我尝试使用 ScrollViewReader 以编程方式滚动水平滚动视图。我认为它会像 UIKit 中带有 .centeredHorizontally 的 scrollToItem 一样工作,并且在大多数情况下它确实如此,但是滚动视图中的最后几个元素被强制滚动到屏幕中心,尽管滚动视图不是'通常无法滚动那么远(至少在释放拖动后不会弹回)。这最终会在屏幕的后半部分创建白色 space。
我看到了其他一些关于此的问题,似乎普遍认为这不是错误?一方面,我想我们是在告诉滚动视图将项目居中,它就是这样做的——所以,这不是错误吗?另一方面,这不是 UIKit 中类似功能的工作方式。此外,这种行为只发生在滚动视图的尾端!如果这是预期的行为,我希望使用 .center 锚点滚动到滚动视图中的第一个元素会强制它进入屏幕中心并留下前导白色 space,但这不会发生。
有什么优雅的解决方法吗?或者我们是否必须计算元素的宽度 + 间距并根据屏幕宽度确定我们是应该锚定 .center 还是滚动到最后一个带有锚定 .trailing 的元素以复制 UIKit 行为?
我找到了一个包(Amzd/ScrollViewProxy),它是在 ScrollViewReader 发布之前制作的,其功能与 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 的访问。
我可以确认此行为并认为它应该被视为一个错误。特别是因为滚动视图会在第一次触摸事件时“跳”到位。
从 iOS 15.4 Beta 1 开始,这对我来说是固定的。也许再试一次。