iOS 14小部件检测系统主题更改

问题描述

我在 getTimeline 中使用程序生成的UIImage构造小部件。

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

我知道如何使用fs.access(...)在ViewController中执行此操作,但是如何在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,带有不同的小部件示例,包括环境小部件。