swift - ScrollView 不使用 Geometry Reader 作为子级滚动
问题描述
一些上下文:我目前正在尝试创建一个视图,其中包含嵌入在 ScrollView 中的用户可编辑 TextField()。我想让它在用户单击它键入时屏幕自动滚动到 TextField 的位置(不会被键盘阻止)。我想出了如何通过使用 NavigationCenter 并在打开键盘时实现伪代码 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)
}
}
}
}
}
}
问题:理想情况下,我将能够获得内部和外部 GeometryProxies 的 minY 并减去它们以查看用户滚动了多远。问题是,当我运行此代码时,内部 GeometryReader(出于我不知道的原因)不再允许我滚动。我意识到这是因为 GeometryReader 的高度设置为屏幕的高度,所以当我将其高度设置为 9000 之类的东西时,我可以再次滚动。我尝试将内部几何读取器的高度设置为外部几何读取器的高度,但这不起作用。我还尝试了各种其他解决方案,包括切换哪些视图是父母/孩子——这以及我的其他解决方案也不起作用。
所以,我想知道是否有人知道为什么这个 GeometryReader 不允许我滚动以及如何修复它。或者,如果有人有更好的方法来解决不涉及此方法的整体问题,我将不胜感激听到您的建议。
非常感谢你的帮助!
解决方案
GeometryReader
不是普通的孩子,你不能在未知大小的区域(即 ScrollView)中使用它,因为当父子期望彼此的大小时,你会遇到鸡蛋问题。
而是在内容背景上使用内部几何阅读器,因此内容已定义大小,您可以读取其在其他(全局)坐标系中的位置,例如
ScrollView (.vertical, showIndicators: false) {
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)
}.background(
GeometryReader { inner in
// use proxy here
})
}
推荐阅读
- powerbi - Power BI Embedded,仅通过查看权限生成嵌入令牌
- python - 用 BRISK 替换 SIFT 是 OpenCV 导致错误
- azure - 我们可以使用powershell实现天蓝色自动修复自定义操作,如果可能的话,最好的实践应该是什么?
- python - 在pytest中运行测试用例时如何显示断点而不是断言错误
- google-cloud-platform - GCE - 尽管部署了新版本,但仍调用旧版本的系统
- java - 我的开关案例中的空指针异常错误
- javascript - 当用户尚未在表单中提交数据时,如何防止显示 JavaScript 错误消息?
- javascript - 无法让点击事件在框架中运行
- java - Java Runtime exec 不适用于 redis 删除查询
- android - 刷新 Play Billing 购买缓存