简单介绍
开发环境Xcode 12以上,Widget附加在主APP上,提交时一起审核。
WidgetKit 完全基于SwiftUI 构建。从头文件来看,甚至可以说WidgetKit只是SwiftUI的一个扩展包。 (Widget 和相关WidgetConfiguration 等协议直接位于SwiftUI 库内)
WidgetConfiguration配置:种类标识符;
Provider提供空间刷新定时和刷新内容对象,实际上是控制内容提供者; placeholder 是默认的控制视图;
content 是获取实际渲染视图的块(输入参数是提供者生成的内容)。
从上面的信息也可以看出,苹果的小控件并不像安卓那样自由。它们看起来更像是生成了视图并将快照发布在桌面上。点击这个控件实际上只是打开应用程序,控件本身并不提供交互功能。这就是Apple的关闭方式吧? —— 这样确实可以极大的保证应用桌面常驻性能的稳定性。
开发实践
首先新建一个主工程,然后通过Xcode菜单中的File-New-Target创建,然后选择Widget Extension。注意不要与主工程的名称重复,也不要给Widget命名,否则会报错。
@主要的
结构CustomWidget: 小部件{
让kind: 字符串="CustomWidget"
var body: 一些WidgetConfiguration {
IntentConfiguration(kind: kind,intent: ConfigurationIntent.self,provider: Provider()){条目
CustomWidgetEntryView(条目:条目)
}
.configurationDisplayName("我的小部件")
.description("这是一个示例小部件。")
//创建一个常规的StaticConfiguration,不可配置状态的Widget:
StaticConfiguration(kind: kind,provider: CustomProvider()) { 条目
CustomWidgetEntryTwoView(条目:条目)
}
.configurationDisplayName("第一个Widegt")
.description("这是我的第一个小部件!")
.supportedFamilies([.systemSmall])
}
}WidgetConfiguration本身不能直接使用。目前有两个子类可供使用:
StaticConfiguration,静态widget配置,其实就是一个普通的widget。
IntentConfiguration是具有特定用途的小部件。当您创建小部件时,请选中它,它将为您创建。
image.png是IntentConfiguration的代码。如果不勾选,则为静态StaticConfiguration。两者之间唯一的区别是数据提供者触发的时间不同。
var body: 一些WidgetConfiguration {
StaticConfiguration(kind: kind,provider: Provider()) { 条目
_13EntryView(条目:条目)
}
.configurationDisplayName("我的小部件")
.description("这是一个示例小部件。")
}此时系统默认自带的一个widget就已经创建完成了:
image.png 但这绝对是不够的。我们先分析一下默认的Widget结构:
Provider
结构Provider: IntentTimelineProvider {
func 占位符(在context: 上下文中)-SimpleEntry {
SimpleEntry(date: Date(),configuration: ConfigurationIntent())
}
func getSnapshot(对于configuration: ConfigurationIntent,在context:上下文中,completion: @escaping (SimpleEntry) -()) {
让entry=SimpleEntry(date: Date(),configuration:配置)
完成(输入)
}
func getTimeline(对于configuration: ConfigurationIntent,在context:上下文中,completion: @escaping (时间轴) -()) {
var Entry: [SimpleEntry]=[]
//生成一个时间线,其中包含从当前日期开始的每小时五个条目。
让当前日期=日期()
对于0 . 5 中的hourOffset {
让entryDate=Calendar.current.date(byAdding:hour, value: hourOffset, to: currentDate)!
让条目=SimpleEntry(日期:条目日期,配置:配置)
条目.追加(条目)
}
让时间线=时间线(entries:条目,policy:atEnd)
完成(时间表)
}
}实现了IntentTimelineProvider的这两个重要方法。为了显示小部件库中的小部件,WidgetKit 要求提供者提供预览快照。效果可以在组件的添加页面看到,并且会在添加Widget时执行。getTimeline刷新数据,并通过Timeline(entries:条目,policy:atEnd)控制下次刷新时间。
placeholder:提供一个默认的视图,用于在网络数据请求失败或者其他一些异常发生时显示。
但默认情况下,widget不会自动刷新,如图:
image.png 这个需要后续处理。
SimpleEntry
结构SimpleEntry:时间线条目{
让date: 日期
让configuration:配置意图
}SimpleEntry实现了TimelineEntry协议,主要用于Widget数据存储,与Model类似。
WidgetEntryView
结构FirstWidgetEntryView :视图{
var Entry: Provider.Entry
var body: 一些视图{
文本(条目.日期,style:时间)
}
}WidgetEntryView 是Widget 页面布局View 的一部分。
Widget
@main
结构FirstWidget: 小部件{
让kind: 字符串="FirstWidget"
var body: 一些WidgetConfiguration {
IntentConfiguration(kind: kind,intent: ConfigurationIntent.self,provider: Provider()){条目
FirstWidgetEntryView(条目:条目)
}
.configurationDisplayName("我的小部件")
.description("这是一个示例小部件。")
}
}这个可以看作是Widget的入口,@main函数,可以看作是OC的main函数。 Widget的Kind、Provider、View、WidgetConfiguration等都在这里定义。
PreviewProvider
顾名思义,它提供了预览视图。
结构FirstWidget_Previews: PreviewProvider {
静态变量预览:一些视图{
FirstWidgetEntryView(entry: SimpleEntry(date: Date(),configuration: ConfigurationIntent()))
.previewContext(WidgetPreviewContext(family:systemSmall))
}
创建多个Widget
Swift 不能同时创建多个Widget,否则会报错。个人测试,如果在一个项目中创建两个Widget,会报错。不支持,但可以修改当前Widget的@main入口文件。在这种情况下,将使用WidgetBundle。苹果提供相关API:
组件包
用于从单个小部件扩展公开多个小部件的容器。
@主要的
结构GameWidgets: WidgetBundle {
var body: 一些小部件{
游戏状态Widget()
角色详细信息控件()
}
}
注意:
创建多个Widget时,注意将文件绑定到对应的Target,否则会报各种错误。我被这个问题困扰了很久,如图:
关于深入解析iOS 14 Widget开发:第一篇——Widget入门指南的内容到此结束,希望对大家有所帮助。
【深入解析iOS 14 Widget开发:第一篇——Widget入门指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于能自己设计小工具了,看起来还挺简单操作的。
有20位网友表示赞同!
最近一直在使用第三方的小工具,有了自己的开发经验岂不是太酷了?
有10位网友表示赞同!
希望能够学习到一些开发技巧,然后自己制作个有趣的小工具。
有16位网友表示赞同!
看到这个标题感觉很激动,终于有机会深入了解这个新的功能
有18位网友表示赞同!
iOS 系统真是越来越智能了,小工具的功能可以用得着呢!
有18位网友表示赞同!
我有很多想法想要用小工具实现,现在有了开发指南太棒了。
有18位网友表示赞同!
这篇文章是不是会详细讲解如何创建和使用小工具呢?
有17位网友表示赞同!
学习一个小工具的制作经验应该也不复杂吧?期待这个实践指南!
有9位网友表示赞同!
我的手机已经升级iOS14了,希望这篇文章能让我了解一下小工具的使用方法。
有17位网友表示赞同!
看到介绍Widget感觉很有意思,我想知道它有哪些使用场景。
有15位网友表示赞同!
相信很多开发者都在等着这篇文章,这下终于可以着手尝试创建小工具了!
有19位网友表示赞同!
学习新的知识真的很重要,这个开发实践指南一定会有很强的指导意义。
有12位网友表示赞同!
iOS14自带的小工具看起来很棒,希望能了解到更多自定义操作的技巧!
有16位网友表示赞同!
期待这篇文章能详细介绍Widget的代码编写和接口调用方法!
有15位网友表示赞同!
我一直想自己制作个小工具,这个实践指南刚好可以帮助我实现愿望!
有13位网友表示赞同!
希望文章中能提供一些小工具设计的技巧和案例分享,这样学习会更有目标性。
有15位网友表示赞同!
现在手机的小工具功能越来越普及了,这篇文章对于想要了解它的人来说很有必要!
有12位网友表示赞同!
这个开发实践指南应该可以帮助我更好地理解iOS 14的特性!
有12位网友表示赞同!
通过阅读这篇文章,我想学习到如何利用Widget来提高手机的使用体验。
有7位网友表示赞同!
总觉得小工具这个功能很方便,期待能自己动手设计一个出来!
有9位网友表示赞同!