GeometryReader大小计算SwiftUI

时间:2019-09-05 05:07:15

标签: xcode geometry swiftui macos-catalina

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

图片上: enter image description here 简单的代码:

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 任何指导将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题是您使用的VStack内部有两个GeometryReaderVStack将其子级垂直放置,一个在另一个上方。您的第二个y=0中的GeometryReader是第一个GeometryReader之后的第一个y 。我建议您更改设计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)
    }
}

结果是:

enter image description here

要向上或向下或向左/向右推动,您可以使用非常有用的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)
    }
}

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