是否可以在 iOS 14 小部件中动态更新/更改它们的布局(例如视图数)?
Is it possible to dynamicly update / change they layout (e.g. number of views) in an iOS 14 Widget?
我正在开发我的第一个 iOS 14 小部件。我知道小部件大多是静态的,不能显示动画等动态内容。但是是否可以更改小部件中的布局/视图数量?
由于我是 SwiftUI 的新手,我看不到任何更改视图内容的方法。
上下文:
假设一个 ToDo 应用程序,其中小部件应显示最多 5 个条目的 buttons/links。但是,如果应用程序中当前只有 3 个条目,那么小部件当然应该只显示 3 个链接。
该应用程序已提供今日小工具。在这里,我通过简单地将固定数量的条目(例如 5)的控件(按钮)添加到小部件视图来解决了这个问题。如果应显示较少的条目,则当小部件更新其视图时,未使用的控件将被简单地隐藏。
在 SwiftUI 中创建具有固定数量的条目(链接)的小部件视图是没有问题的。但是如何 hide/remove 未使用的视图?
在 SwiftUI 中,视图是一个 some View
变量,我看不到动态更改其内容的方法:
struct MyEntryView: View {
var body: some View {
Hstrack {
// Item 1
// Item 2
...
// Item n
}
}
}
窗口小部件视图是 静态的,但只要有新条目传递给它们,它们就会重绘。
无法创建将在 collection 更改时自行更新的 Widget 视图。
您可以:
- 提前创建条目
- 或者当您检测到 collection
发生变化时强制刷新时间线
在这两种情况下,您都需要创建一个条目:
struct SimpleEntry: TimelineEntry {
let date: Date
let items: [String]
}
并在视图中显示其项目:
struct SimpleWidgetEntryView: View {
var entry: SimpleProvider.Entry
var body: some View {
VStack {
ForEach(entry.items, id: \.self) {
Text([=11=])
}
}
}
}
唯一的区别在于您创建条目的方式:
您可以:
- 提前创建条目(
items
的大小可能会有所不同):
func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
var entries = [SimpleEntry]()
let currentDate = Date()
for offset in 0 ..< 5 {
let entryDate = Calendar.current.date(byAdding: .minute, value: offset, to: currentDate)!
entries.append(SimpleEntry(date: entryDate, items: Array(repeating: "Test", count: offset + 1)))
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
- 或使用当前数据创建一个条目,每当数据发生变化时,通过调用刷新小部件:
WidgetCenter.shared.reloadAllTimelines()
(您重新加载时间线的频率可能有限制)。
我正在开发我的第一个 iOS 14 小部件。我知道小部件大多是静态的,不能显示动画等动态内容。但是是否可以更改小部件中的布局/视图数量?
由于我是 SwiftUI 的新手,我看不到任何更改视图内容的方法。
上下文:
假设一个 ToDo 应用程序,其中小部件应显示最多 5 个条目的 buttons/links。但是,如果应用程序中当前只有 3 个条目,那么小部件当然应该只显示 3 个链接。
该应用程序已提供今日小工具。在这里,我通过简单地将固定数量的条目(例如 5)的控件(按钮)添加到小部件视图来解决了这个问题。如果应显示较少的条目,则当小部件更新其视图时,未使用的控件将被简单地隐藏。
在 SwiftUI 中创建具有固定数量的条目(链接)的小部件视图是没有问题的。但是如何 hide/remove 未使用的视图?
在 SwiftUI 中,视图是一个 some View
变量,我看不到动态更改其内容的方法:
struct MyEntryView: View {
var body: some View {
Hstrack {
// Item 1
// Item 2
...
// Item n
}
}
}
窗口小部件视图是 静态的,但只要有新条目传递给它们,它们就会重绘。
无法创建将在 collection 更改时自行更新的 Widget 视图。
您可以:
- 提前创建条目
- 或者当您检测到 collection 发生变化时强制刷新时间线
在这两种情况下,您都需要创建一个条目:
struct SimpleEntry: TimelineEntry {
let date: Date
let items: [String]
}
并在视图中显示其项目:
struct SimpleWidgetEntryView: View {
var entry: SimpleProvider.Entry
var body: some View {
VStack {
ForEach(entry.items, id: \.self) {
Text([=11=])
}
}
}
}
唯一的区别在于您创建条目的方式:
您可以:
- 提前创建条目(
items
的大小可能会有所不同):
func getTimeline(in context: Context, completion: @escaping (Timeline<SimpleEntry>) -> Void) {
var entries = [SimpleEntry]()
let currentDate = Date()
for offset in 0 ..< 5 {
let entryDate = Calendar.current.date(byAdding: .minute, value: offset, to: currentDate)!
entries.append(SimpleEntry(date: entryDate, items: Array(repeating: "Test", count: offset + 1)))
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
- 或使用当前数据创建一个条目,每当数据发生变化时,通过调用刷新小部件:
WidgetCenter.shared.reloadAllTimelines()
(您重新加载时间线的频率可能有限制)。