ScrollView不能使用Geometry Reader滚动作为子级

时间:2020-08-27 04:39:16

标签: swift swiftui

某些上下文::我目前正在尝试创建一个视图,该视图包含嵌入到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的最小值,并减去它们以查看用户滚动了多远。问题是,当我运行此代码时,内部的GeometryReader(由于我未知的原因)不再允许我滚动。我意识到这是因为GeometryReader的高度设置为屏幕的高度,所以当我将其高度设置为9000时,便可以再次滚动。我尝试将内部Geometry Reader的高度设置为外部GeometryReader的高度,但这不起作用。我还尝试了其他各种解决方案,包括切换哪些视图是父母/孩子的,这以及我的其他解决方案也都无效。

所以,我想知道是否有人知道为什么这个GeometryReader不允许我滚动以及如何解决它。或者,如果有人能用更好的方法解决不涉及此方法的总体问题,我将不胜感激。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

r不是普通孩子,您不能在未知大小的区域(即ScrollView)中使用它,因为当父子期望彼此大小时,您陷入了鸡蛋问题。

而不是在内容背景上使用内部几何读取器,因此内容具有定义的大小,您可以读取其在其他(全局)坐标系中的位置,例如

mppm