iOS14 widget 从0到1

2021-03-22  本文已影响0人  fairy_happy

iOS14 widget特点

创建一个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 {

    }
}

内容

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刷新,需要实现三个方法如上面代码所示

布局

struct EntryView: View {

    var entry: Provider.Entry // 数据模型

    @Environment(\.widgetFamily) var family // 尺寸环境变量

    @ViewBuilder
    var body: some View {
     
    }
}

EntryView

屏幕上 Widget 显示的内容,可以针对不同尺寸的 Widget 设置不同的 View。只能用swiftUI构建

交互
widget只支持点击交互,通过链接跳转。
有两种链接方式

Link(destination: URL(string: "xxx")!) {
        VStack {
           
        }
    }

运行

先运行app的target,再运行widget的target

上一篇下一篇

猜你喜欢

热点阅读