如何在SwiftUI中设置与superview成比例的高度和宽度?

How to set height and width in proportion with superview in SwiftUI?

我想知道是否可以根据SwiftUI中的superview按比例调整heightwidth到任何UIControl

正如我们所做的那样:

let txtFld = UITextField()
txtFld.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: self.view.frame.width/2, height: self.view.frame.height*0.1))

我知道我们可以通过使用 Spacer().paddingedgeInsets 以某种方式实现调整宽度。但是 height 呢?我看过很多 SwiftUI 的教程,到处都是 height 是静态的。即使在 Apple 的网站上。 SwiftUI Tutorials

如果有人知道如何根据视图的高度设置高度,请在这里分享。因为在某些时候我们需要这样。对于前。如果需要根据设备高度制作按钮。 (假设 iPhone SE = 40,iPhone 8P = 55,iPhone X = 65)

您可以使用 GeometryReader 从 parent 获取该信息:

struct MyView: View {
    var body: some View {
        GeometryReader { geometry in
           /*
             Implement your view content here
             and you can use the geometry variable
             which contains geometry.size of the parent
             You also have function to get the bounds
             of the parent: geometry.frame(in: .global)
           */
        }
    }
}

您可以拥有一个自定义结构 View 并将它的几何图形绑定到一个变量,以使其可以从 View 本身访问它的几何图形。

- 示例:

首先定义一个名为 GeometryGetter 的视图(归功于@kontiki):

struct GeometryGetter: View {
    @Binding var rect: CGRect

    var body: some View {
        return GeometryReader { geometry in
            self.makeView(geometry: geometry)
        }
    }

    func makeView(geometry: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = geometry.frame(in: .global)
        }

        return Rectangle().fill(Color.clear)
    }
}

然后,获取文本视图(或任何其他视图)的边界:

struct MyView: View {
    @State private var rect: CGRect = CGRect()

    var body: some View {
        Text("some text").background(GeometryGetter($rect))

        // You can then use rect in other places of your view:
        Rectangle().frame(width: 100, height: rect.height)
    }
}