Я бы хотел, чтобы у моего 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)
}
}
Теперь, если я оберну body
моего LoadingTitle
в 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)
}
}
}

Я пытался использовать .fixedSize(horizontal: false, vertical: true)
на GeometryReader
в качестве других предложенных , но тогда результирующий вид слишком компактен и все его отступы игнорируются:

Как мне добиться макета 1-го скриншота с относительной шириной?