Здесь возможен подход (по крайней мере для запуска), который я бы предпочел, потому что обе метки остаются независимыми и всегда вводятся в родительский контейнер по первичному тексту.
struct DemoCenteredText: View {
var body: some View {
GeometryReader { gp in
ZStack {
Text("Primary Text").font(.title)
.alignmentGuide(VerticalAlignment.center, computeValue: { $0[.bottom] })
.position(x: gp.size.width / 2, y: gp.size.height / 2)
Text("Secondary Text")
.alignmentGuide(VerticalAlignment.center, computeValue: { $0[.top] - 16 })
}
}
}
}
Приведенное выше .position
фиксирует основной заголовок в центре родительского контейнера, свободное пространство которого используется GeometryReader
, а alignmentGuide
заставляет макет размещать вторичный текст по смещению 16 от нижней части основной текст (фактически так же, как ограничение в вашем вопросе).