具有系统背景颜色的列表在暗模式下变得混乱

Posted

技术标签:

【中文标题】具有系统背景颜色的列表在暗模式下变得混乱【英文标题】:List with system background color gets messed up in dark mode 【发布时间】:2019-10-15 23:38:34 【问题描述】:

我正在尝试为将适应 ios 模式(浅色/深色)的列表设置背景颜色。 我在 VStacks 中使用 .systemGray5 没有问题,但是在列表中使用它并更改为暗模式时,我得到一个非常暗,几乎是黑色的颜色,这使得一切都难以理解。

无论列表是动态的还是静态的,都会发生这种情况。这是一个错误吗?还是有其他方法可以做到这一点?

    List 
        Text("Privacy").foregroundColor(Color(.systemRed))
    .colorMultiply(Color(.systemGray5))

【问题讨论】:

【参考方案1】:

问题在于colorMultiply 会将列表中的所有颜色(文本、背景、分隔符)与给定颜色相乘(参见multiply color blending)。这将使整个视图变暗,这在浅色模式下可能看起来不错,但与您在深色模式下想要做的相反。

有两种方法可以改变 List 中的背景颜色:

List 
    Text("Privacy").foregroundColor(Color(.systemRed))
        .listRowBackground(Color(.systemGray5))

.background(Color(.systemGray5))

background 会改变整个列表的背景,但我猜这只有在分组列表中才真正可见,因为单元格之间通常没有任何空格。

listRowBackground 在 List 环境中使用时更改视图的背景颜色。这可能就是你想在这里使用的。

【讨论】:

好的,所以这有助于静态列表,但动态列表仍然不应用系统灰色。一旦我写了这样的东西:List(pumpData) pump in 列表不应用灰色 您是否将listRowBackground 应用于您在内部 List() ... 块中创建的视图? 这是我的非工作代码:List(pumpData) pump in Text("pump").listRowBackground(Color(.systemGray5)) .background(Color(.systemGray5)) 我为这个看似错误的解决方法提供了另一个答案..【参考方案2】:

Frank Schlegel 提供了一个仅适用于静态列表的答案。在 Apple 为动态列表修复此问题之前,我使用此代码解决了我的问题

List 
    ForEach(pumpData)  pump in
        Text("pump").listRowBackground(Color(.systemGray5))
        
    .background(Color(.systemGray5))

【讨论】:

【参考方案3】:

.secondarySystemGroupedBackground 为我工作。

【讨论】:

以上是关于具有系统背景颜色的列表在暗模式下变得混乱的主要内容,如果未能解决你的问题,请参考以下文章

加载具有不同背景颜色的 Git Bash

可绘制文件在深色模式下不会改变颜色

覆盖 SwiftUI 视图的默认背景颜色?

SwiftUI Textfield - 如何在编辑模式下设置文本字段的背景颜色以清除

暗模式干扰背景颜色

让用户在暗模式和亮模式之间进行选择(保存每个页面的设置,cookie?)