iOS14 widget 从0到1

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) -> 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

你可能感兴趣的:(iOS14 widget 从0到1)