如何获取SwiftUI中与primary颜色相反的倒置颜色?
SwiftUI 主题依赖颜色的倒置版本获取方法
以下三种实现方式均支持自动适配亮暗色主题:
- 方案1:直接使用系统语义化背景色(最推荐,符合系统设计规范)
系统本身提供了和\.primary、\.secondary等前景色天然配对的背景色,不需要手动做倒置,自动跟随主题切换:- 对应
.primary的倒置背景:Color(UIColor.systemBackground),亮色模式为白色,暗色模式为黑色 - 对应
.secondary的倒置背景:Color(UIColor.secondarySystemBackground)
用法示例:
Text("示例文本") .foregroundColor(.primary) .background(Color(UIColor.systemBackground)) - 对应
- 方案2:使用
colorInvert()修饰符(最简单的通用倒置方案)
如果需要对任意主题依赖颜色做动态倒置,直接调用colorInvert()方法即可,系统会先读取当前主题下的实际颜色值,再做倒置处理:// 直接获取.primary的动态倒置色 let invertedPrimary = Color.primary.colorInvert() // 用法示例 RoundedRectangle(cornerRadius: 8) .fill(Color.secondary.colorInvert()) - 方案3:自定义Color扩展适配复杂场景
如果需要在自定义逻辑中复用倒置能力,可以给Color加扩展实现动态倒置:
如果需要适配macOS平台,将代码中的extension Color { /// 返回当前主题下颜色的倒置版本,自动适配亮暗色模式 var dynamicInverted: Self { let uiColor = UIColor(self) var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 uiColor.getRed(&r, green: &g, blue: &b, alpha: &a) return Color(red: 1 - r, green: 1 - g, blue: 1 - b, opacity: a) } }UIColor替换为NSColor即可。
所有方案都不需要手动监听主题切换,系统会在主题变化时自动重新计算颜色值,无需额外开发成本。
内容的提问来源于stack exchange,提问作者Paul B
相关产品推荐
相关产品推荐

