如何在SwiftUI中更改Picker菜单文本大小?

18

我有一个样式为菜单Picker,我需要更改它的文本大小(蓝色文本),我尝试了.font(.largeTitle)修改器,但它没有起作用。

enum Privacy: String, Identifiable, CaseIterable {
    case open = "Open"
    case closed = "Closed"
    var id: String { self.rawValue }
}

struct ContentView: View {
    @State var selection = Privacy.open
    var body: some View {
        Picker("Privacy", selection: $selection) {
            ForEach(Privacy.allCases) { value in
                Text(value.rawValue)
                    .tag(value)
                    .font(.largeTitle)
            }
        }
        .font(.largeTitle)
        .pickerStyle(.menu)
    }
}


你是指蓝色标签还是按下时出现的行? - George
@George 我的意思是蓝色标签。 - Fawzi Rifa'i
为什么我们不能像更改按钮等其他文本一样更改文本属性。这是不一致的。 - Hope
4个回答

29
.menu的样式移除,改为将其包裹在Menu中,并使用自定义标签:
Menu {
    Picker(selection: $selection) {
        ForEach(Privacy.allCases) { value in
            Text(value.rawValue)
                .tag(value)
                .font(.largeTitle)
        }
    } label: {}
} label: {
    Text("Privacy")
        .font(.largeTitle)
}

谢谢!它起作用了。 - Fawzi Rifa'i
10
当我尝试这样做时,ForEach 中的字体大小设置似乎没有任何效果。 - scaly

11
如果有人需要在此场景中将所选值显示为标签(而不是静态文本),可以使用以下变体。
已测试通过 Xcode 13.2 / iOS 15.2。
演示图片如下:demo
Menu {
    Picker(selection: $selection) {
        ForEach(Privacy.allCases) { value in
            Text(value.rawValue)
                .tag(value)
        }
    } label: {}
} label: {
    Text(selection.rawValue)
        .font(.largeTitle)
}.id(selection)

1
我在Xcode 14.2 / iOS 16.2 / iPhone 14 pro模拟器上尝试了这段代码。选择的值不再更新。在选择“关闭”后,“打开”仍然显示。 - Heinz M.

4

我只需在其上应用scaleEffect修饰符,而无需将其放置在菜单中,就可以得到相同的结果。

在Picker()视图的结尾括号或其包含的Stack上放置.scaleEffect(1.5)。您将使整个选择器变大,但对于像问题(菜单样式选择器)这样的情况,这是一个简单的解决方案。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Vikram Parimi
刚刚讲得更清楚了,这应该能帮到你。@VikramParimi - TrappinNachos

3

我发现在Mac上,Menu { Picker() {} } 这个技巧会导致一些问题(把正确的菜单嵌套在一个单独的菜单项中)。但是下面这个小修改目前在iPhone、iPad和Mac上都能很好地运行:

Menu {
    ForEach(RowLabelType.allCases, id: \.self) { type in
        Button {
            todayTabRowLabels = type
        } label: {
            Text(type.displayString)
        }
    }
} label: {
    Text(todayTabRowLabels.displayString)
}

在 macOS 上,通过将 .pickerStyle(.inline) 添加到 Picker 上,可以移除子菜单。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接