我希望我的LoadingTitle有70%的屏幕宽度,所以我使用GeometryReader,但它使垂直尺寸扩大,我的LoadingTitle占用更多的垂直空间。我希望它尽可能地保持紧凑。
当使用硬编码的width: 300时,我得到了正确的布局(除了相对宽度):
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
LoadingTitle()
Color.blue
}
}
}
struct LoadingTitle: View {
var body: some View {
HStack() {
Color.gray
}
.frame(width: 300, height: 22)
.padding(.vertical, 20)
.border(Color.gray, width: 1)
}
}

现在,如果我将LoadingTitle的body包装在GeometryReader中,我可以获得正确的相对大小,但是GeometryReader会垂直展开我的视图:
struct LoadingTitle: View {
var body: some View {
GeometryReader { geo in
HStack() {
Color.gray
.frame(width: geo.size.width * 0.7, height: 22, alignment: .leading)
Spacer()
}
.padding(.vertical, 20)
.border(Color.gray, width: 1)
}
}
}

我尝试以other suggested的身份在GeometryReader上使用.fixedSize(horizontal: false, vertical: true),但随后得到的视图过于紧凑,并且忽略了它的所有填充:

如何实现相对宽度的第一张截图的布局?
发布于 2020-04-19 15:21:08
这是一种可行的方法。使用Xcode11.4/ iOS 13.4 (不带ContentView )测试

struct LoadingTitle: View {
var body: some View {
VStack { Color.clear }
.frame(height: 22).frame(maxWidth: .infinity)
.padding(.vertical, 20)
.overlay(
GeometryReader { geo in
HStack {
HStack {
Color.gray
.frame(width: geo.size.width * 0.7, height: 22)
}
.padding(.vertical, 20)
.border(Color.gray, width: 1)
Spacer()
}
}
)
}
}发布于 2021-09-20 08:58:32
由于您有固定的标题高度,
struct LoadingTitle1: View {
var body: some View {
GeometryReader { geo in
HStack {
Color.gray.frame(width: geo.size.width * 0.7)
.padding(.vertical, 20)
.border(Color.gray, width: 1)
Spacer()
}
}.frame(height: 62)
}
}https://stackoverflow.com/questions/61300465
复制相似问题