【问题标题】:iOS 14 Widget Detect System Theme ChangeiOS 14 小部件检测系统主题更改
【发布时间】:2020-10-03 08:56:39
【问题描述】:

我在 getTimeline 中使用以编程方式生成的 UIImage 构建我的小部件。

所以我需要在 getTimeline 中知道 iOS 主题是浅色还是深色。

我知道如何在 ViewController 中使用 traitCollection.userInterfaceStyle == .dark 执行此操作,但我如何在 Widget 中执行此操作?

【问题讨论】:

    标签: swift swiftui ios14 widgetkit


    【解决方案1】:

    虽然 Widget 视图是静态的,但您仍然可以检测到 @Environment(\.colorScheme)

    这是一个简单的演示:

    struct WidgetEntryView: View {
        @Environment(\.colorScheme) var colorScheme
    
        var entry: Provider.Entry
    
        var bgColor: some View {
            colorScheme == .dark ? Color.red : Color.orange
        }
    
        var body: some View {
            ZStack {
                bgColor
                Text(entry.date, style: .time)
            }
        }
    }
    

    注意当系统配色方案发生变化时:

    • 仅重绘您的视图,不会再次调用 getTimeline 函数
    • 系统配色方案更改时默认颜色会自动更改

    这是一个GitHub repository,其中包含不同的小部件示例,包括环境小部件。

    【讨论】:

    • 谢谢,但我如何知道 getTimeline 中的 iOS 主题颜色,以便正确渲染图像?
    • @Cosmin 为什么不能在视图中创建它?在getTimeline 中,只需将数据传递给您的条目,然后在视图中根据当前的配色方案创建一个图像。
    • @Cosmin 我最终为每个时间线条目创建了两个图像,然后从视图中选择了正确的一个 Image(uiImage: colorScheme == .dark ? entry.darkImage : entry.lightImage)
    猜你喜欢
    • 2011-09-15
    • 2023-03-30
    • 2021-03-14
    • 2021-01-12
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2020-10-18
    • 2021-03-05
    相关资源
    最近更新 更多