美文网首页
iOS14 widget 从0到1

iOS14 widget 从0到1

作者: fairy_happy | 来源:发表于2021-03-22 18:32 被阅读0次

    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

    相关文章

      网友评论

          本文标题:iOS14 widget 从0到1

          本文链接:https://www.haomeiwen.com/subject/fmoaqltx.html