我正在开发一个 SwiftUI 测试项目,其中涉及根据浅色和深色模式设置调整颜色。
在我的资源目录中,我已配置
theme.colorset
以支持明暗环境的不同颜色,使我能够测试颜色如何适应每种模式。
但是,我遇到了一个问题,无论环境如何,我的代码似乎都只选择
.light
模式颜色。此问题出现在预览画布、模拟器中,甚至在以深色模式启动时的物理设备上。
我最初认为这可能是缓存问题,但清除缓存并没有解决问题。
这是我正在使用的代码的一个最小示例:
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
)
)
}
}
为什么环境的明暗设置似乎被忽略了,有没有办法确保颜色根据活动模式进行调整?任何有关如何解决或解决此问题的建议将不胜感激。
当您在
getHue
上调用 UIColor
时,就会出现问题 - 似乎该函数不尊重动态颜色。
如果将
adjustLuminance
更改为简单的 return Color(uiColor:uiColor)
,而不是返回从色调/饱和度创建的新 UIColor,那么它会按预期工作(尽管没有变化)。
我建议你看看是否可以找到 SwiftUI 修饰符,例如
saturation
或 brightness
来满足你的需求,而不是尝试使用 UI Kit