用户输入 表单对齐

编程语言 2026-07-10

我在做一个表单,让用户输入一些内容。下面是我的代码:

import SwiftUI

struct ContentView: View {
    @State private var searchString = "TEST"
    @State private var searchValue = 0.0
    @State private var tolerance = 10.0

    var body: some View {
        Form {
            Section {
                LabeledContent("Search String:") {
                    TextField("", text: $searchString)
                }
                .labeledContentStyle(.searchLabeledContentStyle)
            }

            Spacer()

            Section {
                LabeledContent("Search Value:") {
                    TextField("", value: $searchValue, format: .number)
                }
                .labeledContentStyle(.searchLabeledContentStyle)

                LabeledContent("Tolerance:") {
                    HStack {
                        TextField("", value: $tolerance, format: .number)

                        Picker("", selection: .constant(1)) {
                            Text("foo")
                                .tag(1)
                            Text("bar")
                                .tag(0)
                        }
                        .pickerStyle(.menu)
                        .labelsHidden()
                    }
                }
                .labeledContentStyle(.searchLabeledContentStyle)
            }

            Spacer()
        }
        .padding()
    }
}

extension LabeledContentStyle where Self == SearchLabeledContentStyle {
    static var searchLabeledContentStyle: Self {
        Self()
    }
}

struct SearchLabeledContentStyle: LabeledContentStyle {
    func makeBody(configuration: Configuration) -> some View {
        HStack(alignment: .firstTextBaseline) {
            configuration.label
                .fontWeight(.semibold)
            configuration.content
                .foregroundStyle(.secondary)
            Spacer()
        }
    }
}

效果如下:

在此输入图片描述

现在我希望底部的两行变短,于是我尝试在 LabeledContent("Search Value:" ){...}LabeledContent("Tolerance:") { ... } 上添加 .frame(width: 300)。但现在右侧对齐就不再一致了:

图片 1

我要怎么解决?

解决方案

我认为这里发生的情况是:

LabeledContent 上放置 frame,意味着带标签内容的标签部分也会共享该框架的一部分。由于“Tolerance”的宽度比“Search Value”窄,因此用于“Tolerance”的文本字段+ 选择器比用于“Search Value”的文本字段要宽。

如果你只把 .frame(width: 300) 放在带标签内容的“内容”部分上,就能实现所需的布局。

LabeledContent("Search Value:") {
    TextField("", value: $searchValue, format: .number)

    .frame(width: 300)
}

LabeledContent("Tolerance:") {
    HStack {
        TextField("", value: $tolerance, format: .number)

        Picker("", selection: .constant(1)) {
            Text("foo")
                .tag(1)
            Text("bar")
                .tag(0)
        }
        .pickerStyle(.menu)
        .labelsHidden()
    }
    .frame(width: 300)
}

在此输入图片描述

顺便说一句:你可以一次性将 labeledContentStyle 应用于整个 Form,而不是逐个应用到每个 LabeledContent

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章