以下是小部件扩展的代码示例.

通过使用.environment(\.colorScheme, ...),我能够使用正确的主题感知命名 colored颜色 来更新视图.

但是,我无法从主题感知命名 colored颜色 中检索到正确的RGB值.

private func getColorScheme() -> ColorScheme {
    if ... {
        return ColorScheme.dark
    } else {
        return ColorScheme.light
    }
}

@ViewBuilder
func contentView() -> some View {

    // Light/ dark theme aware
    let color = SwiftUI.Color("yellowNoteColor")

    calculate(color)
    
    HStack {
        ...
    }
    .background(color)
    .environment(\.colorScheme, getColorScheme())
}

func calculate(_ color: SwiftUI.Color) {
    var a: CGFloat = 0.0
    var r: CGFloat = 0.0
    var g: CGFloat = 0.0
    var b: CGFloat = 0.0

    let uiColor = UIColor(self)
    uiColor.getRed(&r, green: &g, blue: &b, alpha: &a)

    // !!! Always get the light theme color value !!!
}

calculate函数内,检索到的值始终为浅色主题 colored颜色 值.

我的猜测是,caculate函数在.environment(\.colorScheme, getColorScheme())之前执行,这就是为什么我们总是得到浅色主题 colored颜色 值.

请问,如何从主题感知命名 colored颜色 中获取正确的RGB值?


附注:(用谷歌翻译翻译)

在主应用程序中,我们可以使用overrideUserInterfaceStyle来更改主应用程序主题,然后根据选定的主应用程序主题检索正确的RGB.

但是,我不确定我们如何在WidgetKit年内做到这一点.

推荐答案

您可以直接在UIColor上使用resolvedColor方法来获得正确的值.因此,您可以将 colored颜色 名称传递给Calculate方法,而不是传递SwiftUI.Color个实例.

因为在Widgets中也有UIColor,所以它应该会给你正确的RGB值.

Why is it not working in your case?

我的猜测是,因为SwiftUI.Color是一个 struct ,并且您在calculate方法中传递它,所以当系统基于给定的ColorScheme更改其RGB值时,它将创建 colored颜色 实例的副本.因此,您的calculate方法仍然具有旧的副本(具有来自浅色方案的RGB值),但是系统具有正确的副本(具有来自深色方案的RGB值)

@ViewBuilder
func contentView() -> some View {
    let name = "yellowNoteColor"
    let color = SwiftUI.Color(name)
    calculate(name)
    return VStack {
        Image(systemName: "globe")
            .imageScale(.large)
            .foregroundColor(.accentColor)
        Text(calculate(name))
    }
    .background(color)
    .environment(\.colorScheme, getColorScheme())

}

func calculate(_ name: String) -> String {
    var a: CGFloat = 0.0
    var r: CGFloat = 0.0
    var g: CGFloat = 0.0
    var b: CGFloat = 0.0

    if let uiColor = UIColor(named: name)?.resolvedColor(with: UITraitCollection(userInterfaceStyle: .dark)) {
        uiColor.getRed(&r, green: &g, blue: &b, alpha: &a)
        return "Red: \(r), Green: \(g), Blue: \(b), Alpha: \(a)"
    }
    return ""
}

Xcode Simulator

Ios相关问答推荐

如何加密字符串使用AES. GCM在Dart和解密相同的Swift?

如何在SwiftUI中扩展 colored颜色 超出顶部边缘

UIBezierPath包含:方法不检测到厚度大于1像素的线上的touch

在SwiftUI中动态隐藏列表的空部分

在视图上执行手势会阻止相机操作

如何在不将应用程序留在SwiftUI上的情况下更改语言?

当 .searchable 修饰符处于活动状态时,如何将变量设置为 false?

如何在Swift/Combine中从timer.publish属性传递两个参数到任意方法

Swift Vision库识别文本后如何将其赋值给 struct 体实例属性以供显示?

不可发送类型 '[String : Any]?'在调用非隔离实例方法 XXX 时退出主参与者隔离上下文不能跨越参与者边界

iOS 16.4 更新后 Xcode 14.3 构建错误:找不到 libarclite_iphoneos.a,链接器命令失败

如何在 SwiftUI 中同时使用 LongPressGesture 和 ScrollView 中的滚动?

@MainActor 类的扩展是主要演员吗?

滚动 swiftUI 列表时,未调用单元格的任务修饰符.怎么修?

将角半径仅应用于 Swiftui 中按钮的两个角

DateFormatter 使用 TimeZone 和 Locale 的特定组合返回 nil

如何使用 Swift 文档注释

使用导航控制器在prepareForSegue中设置数据

如何覆盖@synthesized getter?

iOS 7 及更高版本: for each 视图控制器设置状态栏样式