iOS14 widget 从0到1
2021-03-22 本文已影响0人
fairy_happy
iOS14 widget特点
-
iOS14 widget可在屏幕进行任意摆放,可以堆叠节省空间,是手机主页更加个性化
-
iOS14 widget自定义功能更加完善,可集成siri的只能话推荐
-
苹果在开发上更加的建议去如何设计一个漂亮的小部件(Widget),如通过颜色,版式和图像传达您的品牌,舒适的信息密度等,详情可查看苹果开发文档
-
适应不同的屏幕尺寸
-
iOS14 widget只能用swiftUI开发
创建一个iOS14 widget
1.新增一个target :File->New->Target添加Widget Extension Target 点击Next。
2.输入widget组件名,根据需要决定是否勾选Include Configuration Intent(是否支持用户配置)
3.创建完成后就会看到默认生成的文件与代码
实现一个iOS14 widget
widget实现原理
开发者通过 SwiftUI 构建 Views,定义Timelines为 Views 提供对应时间所需的数据,当数据变化时,通过reload更新数据。TimelineProvider提供一组TimelineEntry和ReloadPolicy,用来后续刷新页面。
系统自带方法介绍
入口
@main
struct UserWidget: Widget {
private let kind: String = "UserWidget"
public var body: some WidgetConfiguration {
}
}
- kind:字符串,唯一标识 Widget。
- WidgetConfiguration:有两类配置,分别为
- StaticConfiguration : 可以在不需要用户任何输入的情况下自行解析, 可以在 Widget 的 App 中获取相关数据并发送给 Widget。
- IntentConfiguration:依赖于 App 的 Siri Intent,会自动接收这些 Intent 并用于更新 Widget,用于构建动态 Widget。
- supportedFamilies:支持不同尺寸,可以指定支持的尺寸
内容
struct Model: TimelineEntry {
let date: Date
// 显示的内容Model
}
数据模型,需要遵守TimelineEntry协议
struct Provider: TimelineProvider {
// 占位视图,是一个标准的 SwiftUI View,当第一次展示或者发生错误时都会展示该 View。
func placeholder(in context: Context) -> TimelineEntry {
}
// 编辑屏幕在左上角选择添加Widget、第一次展示时会调用该方法
func getSnapshot(in context: Context, completion: @escaping (TimelineEntry) -> Void) {
}
// 进行数据的预处理,转化成Entry
// 最后一定要调用 completion,进而刷新Widget
func getTimeline(in context: Context, completion: @escaping (Timeline<TimelineEntry>) -> Void) {
}
}
provider 遵守TimelineProvider协议,控制widget刷新,需要实现三个方法如上面代码所示
- getTimeline 是最重要的方法,需要再这个方法李实现数据的获取和模型转换
- getTimeline 的方法里有一个 policy 参数,表示刷新的时机,可以选择.never(不刷新),.atEnd(Entry 显示完毕之后自动刷新) 或 .after(date)(到达某个特定时间后自动刷新)
- Widget 刷新的时间由系统统一决定(有时候设置了也不会自己刷新),如果需要强制刷新 Widget,可以在 App 中使用 WidgetCenter 来重新加载所有时间线:WidgetCenter.shared.reloadAllTimelines()
布局
struct EntryView: View {
var entry: Provider.Entry // 数据模型
@Environment(\.widgetFamily) var family // 尺寸环境变量
@ViewBuilder
var body: some View {
}
}
EntryView
屏幕上 Widget 显示的内容,可以针对不同尺寸的 Widget 设置不同的 View。只能用swiftUI构建
交互
widget只支持点击交互,通过链接跳转。
有两种链接方式
- widgetURL 点击widget后打开app,small类型只下次widgetURL跳转
- Link 可以给单个控件设计跳转链接,在app内接受处理(appdelegate中的openurl 或者SceneDelegate中的openurl)
Link(destination: URL(string: "xxx")!) {
VStack {
}
}
运行
先运行app的target,再运行widget的target