使用AnchorPoint和坐标设置SwiftUI滚动视图中的位置

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

阅读精彩的教程(使用 PreferenceKey),我能够跟随 SwiftUI ScrollView 中的滚动。

例如,在 ScrollView 中:

  • y 内容大小为 5000 pt
  • 滚动视图高度为 675 pt => 当我滚动到滚动视图底部时读取的位置是 4325pt (5000 - 675)

好的。现在我想在 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))

但是,这行不通。 我找不到为所有滚动场景(顶部、中间、底部)添加额外空间的方法。当滚动条位于顶部时,我也不需要添加任何内容。

swiftui position scrollview anchorpoint
1个回答
0
投票

我想这就是你想要的:

let unitPointY = offset / (contentHeight - scrollViewHeight)

所以,就你而言:

let unitPointY = 4325 / (5000 - 675)

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