如何使视图与其内容一样高
How to make a view as high as its content
我怎样才能使视图具有最小尺寸、最大尺寸和介于两者之间的垂直 space 消耗内容所需的数量?
struct SubView<Content: View>: View {
private let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
VStack(alignment: .leading) {
Text("Text")
.padding([.leading, .trailing])
ZStack {
Color(.red)
self.content()
}
.clipShape(RoundedRectangle(cornerRadius: 20))
}
.padding()
}
}
struct SubView_Previews: PreviewProvider {
static var previews: some View {
VStack {
SubView {
Text("A")
}
SubView {
VStack {
Text("A")
Text("B")
Text("C")
Text("D")
}
}
}
}
}
在上面的示例中,两个视图的大小都已调整为最大大小。但我想让两个矩形都采用其内容的大小,如下所示:
到目前为止,我只知道如何使用 frame 修改器设置固定高度或无限 maxHeight,但这些都不会带来所需的结果。
您可以将 Color.red
移到后台(而不是 ZStack
):
struct SubView<Content: View>: View {
// ...
var body: some View {
VStack(alignment: .leading) {
Text("Text")
.padding([.leading, .trailing])
self.content()
.padding()
.frame(maxWidth: .infinity)
.background(
RoundedRectangle(cornerRadius: 20)
.fill(Color.red)
)
.padding([.leading, .trailing])
}
.padding()
}
}
我怎样才能使视图具有最小尺寸、最大尺寸和介于两者之间的垂直 space 消耗内容所需的数量?
struct SubView<Content: View>: View {
private let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
VStack(alignment: .leading) {
Text("Text")
.padding([.leading, .trailing])
ZStack {
Color(.red)
self.content()
}
.clipShape(RoundedRectangle(cornerRadius: 20))
}
.padding()
}
}
struct SubView_Previews: PreviewProvider {
static var previews: some View {
VStack {
SubView {
Text("A")
}
SubView {
VStack {
Text("A")
Text("B")
Text("C")
Text("D")
}
}
}
}
}
在上面的示例中,两个视图的大小都已调整为最大大小。但我想让两个矩形都采用其内容的大小,如下所示:
到目前为止,我只知道如何使用 frame 修改器设置固定高度或无限 maxHeight,但这些都不会带来所需的结果。
您可以将 Color.red
移到后台(而不是 ZStack
):
struct SubView<Content: View>: View {
// ...
var body: some View {
VStack(alignment: .leading) {
Text("Text")
.padding([.leading, .trailing])
self.content()
.padding()
.frame(maxWidth: .infinity)
.background(
RoundedRectangle(cornerRadius: 20)
.fill(Color.red)
)
.padding([.leading, .trailing])
}
.padding()
}
}