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

VRA*_*ome 2 xcode ios swift swiftui xcode11

我想知道是否可以根据 superview进行调整height并按width比例调整SwiftUI到任何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))
Run Code Online (Sandbox Code Playgroud)

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

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

Moj*_*ini 5

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

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)
           */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以为您定制一个结构体,View并将其几何体绑定到一个变量,使其几何体可以从View自身外部访问。

- 例子:

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

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)
           */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @VRAwesome我添加了一个例子。检查出。 (2认同)