如何在SwiftUI中设置与superview成比例的高度和宽度?
How to set height and width in proportion with superview in SwiftUI?
我想知道是否可以根据SwiftUI
中的superview按比例调整height
和width
到任何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()
、.padding
和 edgeInsets
以某种方式实现调整宽度。但是 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)
}
}
我想知道是否可以根据SwiftUI
中的superview按比例调整height
和width
到任何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()
、.padding
和 edgeInsets
以某种方式实现调整宽度。但是 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)
}
}