1

我正在尝试使用 GeometryReader 来放置视图。我使用 GeometryReader 修改了 Rectangle() 并按预期放置。但是,我想以编程方式将 y 值设置为与 VStack 框架的顶部对齐。我以为我可以读取文本字段的几何高度并使用它,但我无法将 textField 的几何尺寸分配给变量,即使我使用相同的概念来移动矩形。

图示: 在此处输入图像描述 简单的代码:

struct ContentView: View {

    @State private var textHeight = 0.0

    var body: some View {

        VStack {

            GeometryReader { geometry in
                VStack {
                    Text("Title Text")
                    }
                //self.textHeight = CGFloat(geometry.size.height)
            }.border(Color.green)

            GeometryReader { geometry in
                Rectangle()
                    .path(in: CGRect(x: geometry.size.width - 50,
                                     y: 0, width: geometry.size.width / 2.0,
                                     height: geometry.size.height / 2))
                    .fill(Color.red)
            }

        }.frame(width: 150, height: 300).border(Color.black)
    }
}

Xcode Beta 7, Catalina Beta 7 任何指导将不胜感激。

4

1 回答 1

4

问题是你在里面使用了VStack两个GeometryReader。其VStack子项垂直放置,一个在另一个之上。你的y=0第二个GeometryReader是第一个 y之后的第一个 y GeometryReader。我建议您更改设计 UI 的方式,例如,您可以通过以下方式获得相同的结果:

struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            VStack {
                ZStack {
                    Rectangle()
                        .path(in: CGRect(x: geometry.size.width - 50, y: 0, width: geometry.size.width / 2.0, height: geometry.size.height / 4))
                        .fill(Color.red)

                    Text("Title Text")
                        .frame(width: geometry.size.width, height: geometry.size.height/2.0)
                        .border(Color.green)
                }
                Spacer()
            }
        }
        .frame(width: 150, height: 300).border(Color.black)
    }
}

结果是:

在此处输入图像描述

要上下或左右推动事物,您可以使用真正有用的Spacer视图。

这是我的建议,但如果你真的需要使用两个GeometryReader,你必须这样做:

struct ContentView2: View {

    @State private var textHeight = CGFloat(0)

    private func firstContentView(geometry: GeometryProxy) -> some View {
        textHeight = geometry.size.height
        return Text("Title Text")
            .position(x: geometry.size.width/2.0, y: geometry.size.height/2.0)
    }

    var body: some View {
        VStack(spacing: 0) {
            GeometryReader { geometry in
                self.firstContentView(geometry: geometry)                    
            }.border(Color.green)

            GeometryReader { geometry in
                Rectangle()
                    .path(in: CGRect(x: geometry.size.width - 50, y: -self.textHeight, width: geometry.size.width / 2.0, height: geometry.size.height / 2))
                    .fill(Color.red)
            }
        }.frame(width: 150, height: 300).border(Color.black)
    }
}

但这是一个非常肮脏的解决方案。

于 2019-09-05T16:01:00.623 回答