3

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

所以我需要在getTimeline中知道iOS 主题是 Light 还是 Dark。

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

4

1 回答 1

6

尽管 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 存储库,其中包含不同的 Widget 示例,包括 Environment Widget。

于 2020-10-03T09:35:15.683 回答