浅色/深色模式下的 SwiftUI 颜色在预览或模拟器中不会更新

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

我正在开发一个 SwiftUI 测试项目,其中涉及根据浅色和深色模式设置调整颜色。

在我的资源目录中,我已配置

theme.colorset
以支持明暗环境的不同颜色,使我能够测试颜色如何适应每种模式。

theme.colorset

但是,我遇到了一个问题,无论环境如何,我的代码似乎都只选择

.light
模式颜色。此问题出现在预览画布、模拟器中,甚至在以深色模式启动时的物理设备上。

我最初认为这可能是缓存问题,但清除缓存并没有解决问题。

SwiftUI preview light and dark mode

这是我正在使用的代码的一个最小示例:

struct ContentView: View {
    private var baseColor: Color = .theme
    var body: some View {
        LuminanceVStack(baseColor: baseColor, incrementPercentage: 5)
    }
}

struct LuminanceVStack: View {
    var baseColor: Color
    var incrementPercentage: Double

    var body: some View {
        VStack(spacing: 0) {
            let stepCount = Int(100.0 / incrementPercentage) + 1

            ForEach(0..<stepCount, id: \.self) { i in
                let luminance = Double(i) * (incrementPercentage / 100.0)
                Rectangle()
                    .fill(adjustLuminance(baseColor: baseColor, luminance: luminance))
            }
        }
    }

    private func adjustLuminance(baseColor: Color, luminance: Double) -> Color {
        let uiColor = UIColor(baseColor)

        var hue: CGFloat = 0
        var saturation: CGFloat = 0
        var brightness: CGFloat = 0
        var opacity: CGFloat = 0

        uiColor.getHue(&hue, saturation: &saturation, brightness: &brightness, alpha: &opacity)

        return Color(
            uiColor: UIColor(
                hue: hue,
                saturation: saturation,
                brightness: max(min(luminance, 1.0), 0.0),
                alpha: opacity
            )
        )
    }
}

模拟器更改环境但颜色未更新的演示视频

我尝试过的事情

  • 预览重置:尝试重置画布预览,认为这可能是缓存问题。
  • 模拟器:通过明确将环境设置为深色模式在模拟器中进行测试,但仍然只出现浅色模式颜色。
  • 物理设备:在物理设备上深色模式下测试,仍然只应用浅色模式颜色。

问题

为什么环境的明暗设置似乎被忽略了,有没有办法确保颜色根据活动模式进行调整?任何有关如何解决或解决此问题的建议将不胜感激。

ios swift swiftui color-scheme
1个回答
0
投票

当您在

getHue
上调用
UIColor
时,就会出现问题 - 似乎该函数不尊重动态颜色。

如果将

adjustLuminance
更改为简单的
return Color(uiColor:uiColor)
,而不是返回从色调/饱和度创建的新 UIColor,那么它会按预期工作(尽管没有变化)。

我建议你看看是否可以找到 SwiftUI 修饰符,例如

saturation
brightness
来满足你的需求,而不是尝试使用 UI Kit

© www.soinside.com 2019 - 2024. All rights reserved.