Я пытаюсь изучить SwiftUI, и я прочитал эту действительно замечательную статью о alignmentGuides и о том, как выровнять представления, которые находятся в разных контейнерах: https://swiftui-lab.com/alignment-guides/
В моем пользовательском интерфейсе я хочу иметь галочку, затем вопрос с меткой Text () в одной строке (оранжевый), затем ниже, где я хочу TextField (), где они могут ответить на вопрос (зеленый), и я хочу, чтобы TextField () приводил к совпадать с лидирующим вопросом Text (). Вот так:

Приведенный выше снимок экрана был создан, когда я принудительно установил ширину зеленого TextField () с помощью .frame(width: 200)
. Я не хочу, чтобы текстовое поле было определенного размера, но когда я
К сожалению, всякий раз, когда я удаляю .frame(width: 200)
...
1) зеленый TextField () тогда растягивается шире экрана 2) внешний VStack также простирается за пределы экрана. 3) и галочка Image () на оранжевом HStack выровнена по передней стороне экрана.
Вот как это выглядит без TextField().frame(width: 200)
, обратите внимание, что синий контур VStack выключен обе стороны экрана:

Вот код:
extension HorizontalAlignment {
private enum QuestionAlignment : AlignmentID {
static func defaultValue(in d: ViewDimensions) -> CGFloat {
return d[.leading]
}
}
static let questionAlignment = HorizontalAlignment(QuestionAlignment.self)
}
struct EasyModeQuestion: View {
@Binding var field : String
var body: some View {
VStack(alignment: .questionAlignment) {
Rectangle()
.fill(Color.primary)
.frame(width: 1)
.alignmentGuide(.questionAlignment, computeValue: { d in d[HorizontalAlignment.leading] })
HStack() {
Image(systemName: "checkmark.square")
Text("What is the blah blah blah?")
.alignmentGuide(.questionAlignment, computeValue: { d in d[.leading] })
}.background(Color.orange)
TextFieldRoundedRect(placeholder: "", text: $field)
.alignmentGuide(.questionAlignment, computeValue: { d in d[.leading] })
.background(Color.green)
//.frame(width: 200)
Rectangle()
.fill(Color.primary)
.frame(width: 1)
.alignmentGuide(.questionAlignment, computeValue: { d in d[HorizontalAlignment.leading] })
}
}
}
Два объекта Rectangle () сверху и снизу Приведены примеры из ссылки в верхней части моего вопроса, которая должна помочь визуализировать, где находится руководство по выравниванию.
Когда я просто go с базовым c ведущим выравниванием и удаляю все направляющие выравнивания, тогда TextField () возвращается к соответствующей ширине: