阅读精彩的教程(使用 PreferenceKey),我能够跟随 SwiftUI ScrollView 中的滚动。
例如,在 ScrollView 中:
好的。现在我想在 onAppear() 中设置最后一个滚动的位置。 所以我需要使用带有锚点的scrollTo。 但锚点是在 0 和 1 之间计算的,并且在 iOS 17 时不使用“绝对”位置。
所以我需要将位置转换为锚点。 可能是这样简单的事情:
let anchorPoint: UnitPoint = UnitPoint(x: lastPositionX / contentWidth, y: lastPositionY / contentHeight)
scroll.scrollTo(bottomId, anchor: anchorPoint)
问题:当我位于锚点滚动底部时,它是 1.0 值,而不是 0.865 (4325/5000)。然而,在我的例子中,与此相对应的位置值是 5000pt,而不是 4325pt,而 4325 实际上是我在底部时读取的 Y 位置。
所以,我认为我需要调整以转换为锚点,但我不符合我可以使用的“规则”。
我看到的是,当Y位置>到contentSize.height的一半时,我需要按比例向scrollViewSize.height添加额外的偏移量,如下所示:
let lastPositionY = scrollPosition.y + (scrollViewSize.height * (scrollPosition.y / contentSize.height))
但是,这行不通。 我找不到为所有滚动场景(顶部、中间、底部)添加额外空间的方法。当滚动条位于顶部时,我也不需要添加任何内容。
我想这就是你想要的:
let unitPointY = offset / (contentHeight - scrollViewHeight)
所以,就你而言:
let unitPointY = 4325 / (5000 - 675)