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

iOS 14 Widget Detect System Theme Change

我在 getTimeline.

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

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

我知道如何在 ViewController 和 traitCollection.userInterfaceStyle == .dark 中做到这一点,但我如何在 Widget 中做到这一点?

尽管 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)
        }
    }
}

注意当系统配色方案改变时:

  • 只有你的View被重绘,getTimeline函数不会被再次调用
  • 默认颜色会在系统配色方案更改时自动更改

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