为什么Picker的tint颜色不更新?

问题描述 投票:0回答:2

我在 SwiftUI 中发现

Picker
的 2 个(对我来说)意想不到的行为。

  1. iOS 上
    Picker
    视图内
    List
    的默认样式似乎是
    .menu
    并且根本不采用任何色调(足够公平)。然而,使用
    .pickerStyle(.menu)
    强制样式会按预期改变选择器的颜色......几乎。
  2. 更改父级视图的色调颜色对此选择器没有任何影响。

你知道为什么会发生这种情况吗?

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)
    }
}

不是初始屏幕截图。这是在更改选择器值之后。

swiftui tint swiftui-picker
2个回答
4
投票

@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


0
投票

如果

.colorMultiply
为不需要的元素着色,请考虑根据您的状态属性使用
.id
修改器重新创建选择器或列表。

List {
    Picker("Default style", selection: $selectedColor) {
        colorList
    }
    Picker("Menu style", selection: $selectedColor) {
        colorList
    }
    .pickerStyle(.menu)  
    Button("Action") { }
}
.tint(selectedColor)
.id(selectedColor)
© www.soinside.com 2019 - 2024. All rights reserved.