锁屏小组件
了解如何在 EasyAppSwiftUI 中实现锁屏小组件
简介
EasyAppWidget 锁屏小组件使用 WidgetKit 提供的 AccessoryWidget 家族,覆盖圆形、矩形与行内三种形态。本文将介绍锁屏视图的布局、数据来源以及如何扩展更多状态展示。
组件类型
- 圆形 (
AccessoryCircularWidgetView) 使用Link打开easyapp://microphone深链,适合用于单一图标入口。 - 矩形 (
AccessoryRectangularWidgetView) 展示 Emoji、品牌文本与当前时间,适合传达即时状态或进度。 - 行内 (
AccessoryInlineWidgetView) 在时间文字旁显示简洁状态行,便于锁屏顶部快速阅览。
这些视图都定义在 EasyAppSwiftUI/EasyAppWidget/WidgetsComponents/AccessoryWidgetViews.swift 中,可根据需求修改排版与文案。
数据来源
- 三种锁屏视图共用
SimpleEntry数据结构,来源于Provider.timeline。 - Emoji 取自
ConfigurationAppIntent.favoriteEmoji,时间采用TimelineEntry.date,确保展示内容与桌面小组件保持同步。
关键代码片段
struct AccessoryCircularWidgetView: View {
let entry: SimpleEntry
var body: some View {
Link(
destination: URL(string: "easyapp://microphone?path=microphone")!,
label: {
Image(systemName: "microphone.fill")
.font(.system(size: 20, weight: .medium))
.foregroundStyle(.blue)
})
}
}- 修改
destinationURL 即可替换为其他应用内功能。 - 若需要展示文本,可在
Link内嵌VStack或HStack结构,但要保持视觉简洁。
struct AccessoryRectangularWidgetView: View {
let entry: SimpleEntry
var body: some View {
HStack(spacing: 8) {
Text(entry.configuration.favoriteEmoji)
.font(.system(size: 24))
VStack(alignment: .leading, spacing: 2) {
Text("EasyApp")
.font(.system(.caption2, design: .rounded))
.fontWeight(.semibold)
.foregroundStyle(.primary)
Text(entry.date, style: .time)
.font(.system(.subheadline, design: .rounded))
.fontWeight(.bold)
.foregroundStyle(.secondary)
}
}
.padding(.horizontal, 8)
}
}- 调整
VStack内容可以增加状态文本或指标,例如“下一场会议 10:30”。 - 对齐方式和间距直接影响锁屏展示效果,建议使用
spacing、padding控制紧凑布局。
struct AccessoryInlineWidgetView: View {
let entry: SimpleEntry
var body: some View {
HStack(spacing: 4) {
Text(entry.configuration.favoriteEmoji)
.font(.system(size: 16))
Text("EasyApp")
.font(.system(.caption, design: .rounded))
.fontWeight(.medium)
Text("•")
.foregroundStyle(.secondary)
Text(entry.date, style: .time)
.font(.system(.caption, design: .rounded))
.fontWeight(.medium)
}
}
}- 行内视图文字较多时,请使用
lineLimit(1)保持单行显示。 - 若要添加实时状态,可将时间替换为
Text(entry.configuration.customStatus)等字段。
使用与配置
- 确保
EasyAppWidget.swift的.supportedFamilies包含.accessoryCircular、.accessoryRectangular与.accessoryInline。 - 在系统锁屏编辑界面添加相应的组件:
- 圆形:适用于左上角/右上角状态位。
- 矩形:适用于锁屏下方的宽条区域。
- 行内:替换默认时间文字旁的简洁描述。
- 编辑
ConfigurationAppIntent参数即可自定义 Emoji 或状态文本。
设计注意事项
- 优先使用系统颜色
.primary、.secondary,避免锁屏在不同背景下出现对比度问题。 - 保持布局简洁,避免过多按钮或复杂交互,锁屏仅允许轻触打开应用。
- 修改字体/字号时,请遵循 WidgetKit 锁屏组件的尺寸限制,防止文本被裁切。
常见问题
- 未显示锁屏组件:确认在主应用的
Info.plist中已启用 Widget Extension,并重新安装。 - 点击无响应:检查自定义 URL Scheme 是否配置正确,或使用
WidgetCenter.shared.reloadAllTimelines()强制刷新后再试。 - 文案被截断:缩短显示文本,或在
AccessoryRectangularWidgetView中使用lineLimit与minimumScaleFactor。 - 暗色下对比度低:改用
.foregroundStyle(.primary)或自定义更亮的系统颜色。
更多锁屏布局示例可在 AccessoryWidgetViews.swift 底部的 #Preview 中预览,分别针对三种尺寸进行调试。
Last updated on