iOS14 widget特點(diǎn)
iOS14 widget可在屏幕進(jìn)行任意擺放,可以堆疊節(jié)省空間孔轴,是手機(jī)主頁更加個(gè)性化
iOS14 widget自定義功能更加完善剃法,可集成siri的只能話推薦
蘋果在開發(fā)上更加的建議去如何設(shè)計(jì)一個(gè)漂亮的小部件(Widget),如通過顏色路鹰,版式和圖像傳達(dá)您的品牌贷洲,舒適的信息密度等,詳情可查看蘋果開發(fā)文檔
-
適應(yīng)不同的屏幕尺寸
iOS14 widget只能用swiftUI開發(fā)
創(chuàng)建一個(gè)iOS14 widget
1.新增一個(gè)target :File->New->Target添加Widget Extension Target 點(diǎn)擊Next晋柱。
2.輸入widget組件名优构,根據(jù)需要決定是否勾選Include Configuration Intent(是否支持用戶配置)
3.創(chuàng)建完成后就會(huì)看到默認(rèn)生成的文件與代碼
實(shí)現(xiàn)一個(gè)iOS14 widget
widget實(shí)現(xiàn)原理
開發(fā)者通過 SwiftUI 構(gòu)建 Views,定義Timelines為 Views 提供對應(yīng)時(shí)間所需的數(shù)據(jù)雁竞,當(dāng)數(shù)據(jù)變化時(shí)钦椭,通過reload更新數(shù)據(jù)。TimelineProvider提供一組TimelineEntry和ReloadPolicy碑诉,用來后續(xù)刷新頁面彪腔。
系統(tǒng)自帶方法介紹
入口
@main
struct UserWidget: Widget {
private let kind: String = "UserWidget"
public var body: some WidgetConfiguration {
}
}
- kind:字符串,唯一標(biāo)識(shí) Widget联贩。
- WidgetConfiguration:有兩類配置漫仆,分別為
- StaticConfiguration : 可以在不需要用戶任何輸入的情況下自行解析, 可以在 Widget 的 App 中獲取相關(guān)數(shù)據(jù)并發(fā)送給 Widget泪幌。
- IntentConfiguration:依賴于 App 的 Siri Intent盲厌,會(huì)自動(dòng)接收這些 Intent 并用于更新 Widget,用于構(gòu)建動(dòng)態(tài) Widget祸泪。
- supportedFamilies:支持不同尺寸吗浩,可以指定支持的尺寸
內(nèi)容
struct Model: TimelineEntry {
let date: Date
// 顯示的內(nèi)容Model
}
數(shù)據(jù)模型,需要遵守TimelineEntry協(xié)議
struct Provider: TimelineProvider {
// 占位視圖没隘,是一個(gè)標(biāo)準(zhǔn)的 SwiftUI View懂扼,當(dāng)?shù)谝淮握故净蛘甙l(fā)生錯(cuò)誤時(shí)都會(huì)展示該 View。
func placeholder(in context: Context) -> TimelineEntry {
}
// 編輯屏幕在左上角選擇添加Widget、第一次展示時(shí)會(huì)調(diào)用該方法
func getSnapshot(in context: Context, completion: @escaping (TimelineEntry) -> Void) {
}
// 進(jìn)行數(shù)據(jù)的預(yù)處理阀湿,轉(zhuǎn)化成Entry
// 最后一定要調(diào)用 completion赶熟,進(jìn)而刷新Widget
func getTimeline(in context: Context, completion: @escaping (Timeline<TimelineEntry>) -> Void) {
}
}
provider 遵守TimelineProvider協(xié)議,控制widget刷新陷嘴,需要實(shí)現(xiàn)三個(gè)方法如上面代碼所示
- getTimeline 是最重要的方法映砖,需要再這個(gè)方法李實(shí)現(xiàn)數(shù)據(jù)的獲取和模型轉(zhuǎn)換
- getTimeline 的方法里有一個(gè) policy 參數(shù),表示刷新的時(shí)機(jī)灾挨,可以選擇.never(不刷新)邑退,.atEnd(Entry 顯示完畢之后自動(dòng)刷新) 或 .after(date)(到達(dá)某個(gè)特定時(shí)間后自動(dòng)刷新)
- Widget 刷新的時(shí)間由系統(tǒng)統(tǒng)一決定(有時(shí)候設(shè)置了也不會(huì)自己刷新),如果需要強(qiáng)制刷新 Widget劳澄,可以在 App 中使用 WidgetCenter 來重新加載所有時(shí)間線:WidgetCenter.shared.reloadAllTimelines()
布局
struct EntryView: View {
var entry: Provider.Entry // 數(shù)據(jù)模型
@Environment(\.widgetFamily) var family // 尺寸環(huán)境變量
@ViewBuilder
var body: some View {
}
}
EntryView
屏幕上 Widget 顯示的內(nèi)容地技,可以針對不同尺寸的 Widget 設(shè)置不同的 View。只能用swiftUI構(gòu)建
交互
widget只支持點(diǎn)擊交互秒拔,通過鏈接跳轉(zhuǎn)莫矗。
有兩種鏈接方式
- widgetURL 點(diǎn)擊widget后打開app,small類型只下次widgetURL跳轉(zhuǎn)
- Link 可以給單個(gè)控件設(shè)計(jì)跳轉(zhuǎn)鏈接砂缩,在app內(nèi)接受處理(appdelegate中的openurl 或者SceneDelegate中的openurl)
Link(destination: URL(string: "xxx")!) {
VStack {
}
}
運(yùn)行
先運(yùn)行app的target趣苏,再運(yùn)行widget的target