Что ж, я согласен, что Apple, кажется, забыл дать нам что-то в SwiftUI с / от механизма автоматической разметки, например, приоритет захвата контента, сопротивление сжатию, равные размеры и т. Д. c ...
В выравнивании SwiftUI Направляющие не изменяют размеры видов, они просто смещают виды "как есть", выравнивая их по указанным опорным точкам (расширяя контейнер, если он не ограничен в размерах, потому что по умолчанию он плотно прилегает к контенту, то есть то, что вы видите). Таким образом, для решения рассматриваемой ситуации необходимо каким-то образом ограничить (или изменить) размеры.
Приведенный ниже код не является полным решением (он не учитывает возможные l10n), но показывает направление - поскольку Slider
не делает иметь размер по умолчанию, он должен быть немного ограничен, как не расширять контейнер.
В любом случае я бы посчитал это обходным решением ... (вычисления ширины могут быть более точными и сложными, как, например, get frame of Text, например через настройки привязки, а затем вычесть из доступной ширины прокси-сервера геометрии с учетом заполнения, но это все то же самое - указать ширину рамки просмотра явно).
struct HueSaturationView : View {
@State private var num1: Double = 0.5
@State private var num2: Double = 0.5
let blueGreen = Color(red: 0.2, green: 0.6, blue: 0.6)
var body: some View {
GeometryReader { gp in
VStack {
Circle().fill(self.blueGreen).border(Color.blue, width: 1.0).padding(4.0)
VStack(alignment: .myAlignment) {
HStack {
Text("Value:").alignmentGuide(.myAlignment) { d in d[.trailing] }
Slider(value: self.$num1, in: 0...1)
.frame(width: gp.size.width * 2/3)
}
HStack {
Text("Opacity:").alignmentGuide(.myAlignment) { d in d[.trailing] }
Slider(value: self.$num2, in: 0...1)
.frame(width: gp.size.width * 2/3)
}
}
Spacer()
}
.border(Color.green, width: 1.0).padding()
}
}
}