一些上下文:我目前正在尝试创建一个视图,其中包含嵌入 ScrollView 中的用户可编辑的 TextField() 。我想让它在用户单击文本字段进行输入时屏幕自动滚动到文本字段(不会被键盘阻止)。我想出了如何通过使用导航中心并在打开键盘时实现伪代码 view.offset(y: KeyboardHeight) 来实现此功能。
我遇到的问题是,有时,当用户进一步向下滚动并且 TextField 在屏幕上较高时,有时偏移会导致视图过度补偿,并且 TextField 在屏幕上方的区域中移位。因此,您必须再次滚动才能看到 TextField。
我的解决方案:使用 2 个几何读取器来确定用户在屏幕上滚动了多远,并相应地调整文本字段的偏移量(当键盘打开时)。为此,我有一个更复杂的以下代码版本。
struct OverallView: View {
var body: some View {
GeometryReader { outer in
ScrollView (.vertical, showIndicators: false) {
GeometryReader { inner in
VStack {
Text("This is filler text").padding(.vertical, 100)
Text("This is filler text").padding(.vertical, 100)
Text("This is filler text").padding(.vertical, 100)
Text("This is filler text").padding(.vertical, 100)
Text("This is filler text").padding(.vertical, 100)
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题:理想情况下,我能够获得内部和外部 GeometryProxies 的 minY 并减去它们以查看用户滚动了多远。问题是,当我运行此代码时,内部 …