我在 SwiftUI 中发现
Picker
的 2 个(对我来说)意想不到的行为。
Picker
视图内 List
的默认样式似乎是 .menu
并且根本不采用任何色调(足够公平)。然而,使用 .pickerStyle(.menu)
强制样式会按预期改变选择器的颜色......几乎。你知道为什么会发生这种情况吗?
Xcode 14.1 RC,iOS 16.1
struct PickerTintColorTest: View {
let colors: [Color] = [.purple, .green, .orange]
var colorList: some View {
ForEach(colors, id: \.self) { color in
Text(color.description)
}
}
@State private var selectedColor: Color = .green
var body: some View {
List {
Picker("Default style", selection: $selectedColor) { colorList } // <- doesn't have a tint color at all
Picker("Menu style", selection: $selectedColor) { colorList }
.pickerStyle(.menu) // <- forcing to .menu style gives picker a tint color BUT it doesn't update
Button("Action") { } // <- tint as expected, updates as expected
}
.tint(selectedColor)
}
}
不是初始屏幕截图。这是在更改选择器值之后。
@Ryba 不确定这对你来说是否仍然真实,但我今天遇到了完全相同的问题,在我也在这里发布了一个问题之后,我找到了一个解决方案。技巧是将色调颜色设置为
.white
,然后通过 .colorMultiply(_ Color)
修改器而不是 .tint(_ Color)
修改器设置所需的状态绑定。
所以:
Picker(...) {
...
}
.tint(.white) // <-- Set the base color to .white
.colorMultiply(selColor) // <-- Here is the trick
请参阅我的详细答案和代码片段:https://stackoverflow.com/a/76203813/3469410
如果
.colorMultiply
为不需要的元素着色,请考虑根据您的状态属性使用 .id
修改器重新创建选择器或列表。
List {
Picker("Default style", selection: $selectedColor) {
colorList
}
Picker("Menu style", selection: $selectedColor) {
colorList
}
.pickerStyle(.menu)
Button("Action") { }
}
.tint(selectedColor)
.id(selectedColor)