SwiftUI中Color与RGBAColor互转后颜色显示为白色问题求助
问题原因
- SwiftUI 提供的系统语义色(比如
Color.red)本质是动态颜色,会根据当前设备的外观模式(浅色/深色)自动调整显示效果。你代码中转换逻辑的核心问题出在RGBAColor的构造方法:- 你通过
color.cgColor获取颜色值时,若当前没有有效的UIKit trait上下文(你是在静态属性static let rgbaColorRed初始化时调用转换,此时App还未完成界面加载,没有有效上下文),会导致cgColor读取失败。 getRed(_:green:blue:alpha:)方法仅对RGB颜色空间的静态颜色生效,动态颜色未解析时调用该方法会返回失败,你初始化的四个颜色分量默认值都是0,最终得到的是透明度为0的透明色,你看到的“白色”本质是文字透明透出来的背景色,不是文字本身的颜色。
- 你通过
修复方案
方案1(适配iOS15+,CS193p作业通用)
直接用UIColor(_ color: Color)构造方法将SwiftUI Color转为UIColor,系统会自动基于当前上下文解析动态颜色,修改RGBAColor的扩展如下:
extension RGBAColor { init(color: Color) { var red: CGFloat = 0 var green: CGFloat = 0 var blue: CGFloat = 0 var alpha: CGFloat = 0 let uiColor = UIColor(color) uiColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) self.init(red: Double(red), green: Double(green), blue: Double(blue), alpha: Double(alpha)) } }
方案2(兼容低版本iOS)
不要在静态属性中执行颜色转换,将转换逻辑放到界面已经加载完成的上下文(比如View的body内、onAppear回调中)执行,此时已经有有效trait上下文,可以正确获取cgColor的值:
struct ContentView: View { @State private var thisShouldBeRed: Color = .black var body: some View { Text("Hello, world!") .padding() .foregroundColor(thisShouldBeRed) .onAppear { let rgbaColorRed = RGBAColor(color: Color.red) thisShouldBeRed = Color(rgbaColor: rgbaColorRed) } } }
内容的提问来源于stack exchange,提问作者user14119170
相关产品推荐
相关产品推荐

