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 包含环境小部件的不同小部件示例。
我在 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 包含环境小部件的不同小部件示例。