挑戰(zhàn)接受!話說最近圍繞著Widget的話題可真是熱熱鬧鬧??!相信各位腕上功夫高超的大佬們已經(jīng)津津有味的把Widget搞起來,有沒有搞得挺過癮的感覺?那對于還在Widget上懵懵懂懂的小白們來說,不要慌,我來給你帶來一場Widget的構(gòu)建之旅~
Widget這個東西,在iOS14上被蘋果官方推出來了,也就是說,新的Widget視圖可以顯示在用戶的主屏幕上了,豐富了iOS系統(tǒng)的形態(tài)。以前呢,我們只有在通知中心中看到過Widget,iOS14中的Widget可以顯示在桌面上了,但是有一個限制——最多只能放置10個同類型(大小不同,大的和小的算兩個)的Widget。不過,這完全不影響我們嗨皮構(gòu)建Widget呀!
首先呢,我們得創(chuàng)建一個Widget Extension目標(biāo)。步驟如下:
- 打開Xcode,然后選擇File -> New -> Target。
- 在展開的菜單中,找到Application Extension,然后點擊下面的Widget Extension。
- 按下Next,輸入Product Name ,可選擇相關(guān)的 Group,再按Create,此時Xcode會自動生成 Widget Extension 代碼結(jié)構(gòu)。
除此之外,我們還需要對Widget中的View進(jìn)行設(shè)置,比如widgetFamily、body、等等。代碼舉例:
```swift
struct MyAppWidgetView: View {
var body: some View {
VStack {
Text("這里是Widget的標(biāo)題")
Image(systemName: "cloud.sun.rain.fill")
.font(.system(size: 50))
Text("這里是Widget的內(nèi)容")
}
.padding(EdgeInsets(top: 10, leading: 10, bottom: 10, trailing: 10))
}
}
@main
struct MyAppWidget: Widget {
let kind: String = "MyAppWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: MyProvider()) { entry in
MyAppWidgetView()
}
.configurationDisplayName("小I")
.description("這是一個自定義小組件") }
}
struct MyEntry: TimelineEntry {
let date: Date
let relevance: TimelineEntryRelevance?
let name: String
}
struct MyProvider: TimelineProvider {
func placeholder(in context: Context) -> MyEntry {
MyEntry(date: Date(), relevance: nil, name: "占位")
}
func getSnapshot(in context: Context, completion: @escaping (MyEntry) -> ()) {
let entry = MyEntry(date: Date(), relevance: nil, name: "快照")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline let entry = MyEntry(date: Date(), relevance: nil, name: "刻度") let timeline = Timeline(entries: [entry], policy: .atEnd) completion(timeline) } } ``` 上面這段代碼主要功能就是構(gòu)建一個簡單的Widget,你可以根據(jù)自己的需求進(jìn)行修改。其中: - MyAppWidgetView:是Widget中的View,用來展示widget的樣式,響應(yīng)事件,可視為一個自定義的小組件。 - MyProvider:插件提供程序,用于提供有關(guān)小組件的信息,比如占位符,快照和時間軸數(shù)據(jù)。 Widget中有幾個屬性值,我們可以自己設(shè)置,分別如下: - var widgetFamily: @WidgetFamily :當(dāng)前的Widget的類型,目前有三種:systemSmall、systemMedium、systemLarge,分別表示簡約型、中等型、詳細(xì)型。 - var body: Body :主要內(nèi)容,是一個AnyView類型的值,這意味著你可以返回任何的類型作為主要內(nèi)容,包括文字、圖片、按鈕等等。 而且,除此之外,我們還可以把小組件設(shè)置成動態(tài)類型的Widget。動態(tài)類型的Widget意味著視圖在不同的狀態(tài)下會呈現(xiàn)不同的內(nèi)容。所以我們還需要 TimelineProvider 和 TimelineEntry。 TimelineProvider:提供時間軸支持來展示動態(tài)Widget的更新數(shù)據(jù)的可演變過程,主要功能是獲取用于更新小組件的數(shù)據(jù)。 TimelineEntry:構(gòu)建數(shù)據(jù)源模型的內(nèi)容,它有三個參數(shù): - date:時間datetime類型的,表示數(shù)據(jù)的生成時間; - relevance:數(shù)據(jù)時效性相關(guān),和date一起使用; - content:小組件的內(nèi)容,參數(shù)可以是任何小組件。 呼~~~深呼吸,是不是有點看不懂了?別著急,我們還是直接看一下代碼: ```swift struct MyAppWidgetView: View { var text: String var body: some View { Text(text) } } @main struct MyAppWidget: Widget { let kind: String = "MyAppWidget" var body: some WidgetConfiguration { StaticConfiguration(kind: kind, provider: MyProvider()) { entry in MyAppWidgetView(text: entry.text) } .configurationDisplayName("小I") .description("這是一個自定義小組件") } } //TimelineProvider適用于具有周期更新行為的Widget struct MyProvider: TimelineProvider { //定義一個返回PlaceholderEntry類型元素的函數(shù) func placeholder(in context: Context) -> MyEntry { MyEntry(date: Date(), relevance: nil, text: "占位") } //.systemSmall為Static Configuration下的子配置項 func getSnapshot(in context: Context, completion: @escaping (MyEntry) -> ()) { let entry = MyEntry(date: Date(), relevance: nil, text: "快照") completion(entry) } //根據(jù)傳遞的參數(shù),在構(gòu)建初始視圖之后獲取一組一次性數(shù)據(jù),主要用于更新Widget的初始狀態(tài) func getTimeline(in context: Context, completion: @escaping (Timeline var entries = [MyEntry]() // Generate a timeline consisting of five entries an hour apart, starting from the current date. let currentDate = Date() for hourOffset in 0 ..< 5 { let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)! let entry = MyEntry(date: entryDate, relevance: nil, text: "\(hourOffset) 小時前的數(shù)據(jù)") entries.append(entry) } let timeline = Timeline(entries: entries, policy: .atEnd) completion(timeline) } } struct MyEntry: TimelineEntry { let date: Date let relevance: TimelineEntryRelevance? let text: String } ``` 其中: - MyAppWidgetView:展示W(wǎng)idget中的內(nèi)容,這里我們把展示的內(nèi)容設(shè)置成TextView。 - MyProvider:數(shù)據(jù)提供者,在初始化,快照視圖和時間軸更新中生成Widget的初始狀態(tài)。 - TimelineProvider、TimelineEntry:此處涉及到了數(shù)據(jù)的更新,在getTimeline() 方法中每小時更新一次數(shù)據(jù),共更新五次。而MyEntry則是每次更新所包含的數(shù)據(jù)內(nèi)容,這里我們只包含一個text屬性。 好了,到這里,我們就介紹完了包含構(gòu)建靜態(tài)Widget和動態(tài)Widget的全部內(nèi)容。如果你還不理解或者有疑問,可以再看看代碼或者私信我哦~(BuildContext) yinyiprinting.cn 寧波海美seo網(wǎng)絡(luò)優(yōu)化公司 是網(wǎng)頁設(shè)計制作,網(wǎng)站優(yōu)化,企業(yè)關(guān)鍵詞排名,網(wǎng)絡(luò)營銷知識和開發(fā)愛好者的一站式目的地,提供豐富的信息、資源和工具來幫助用戶創(chuàng)建令人驚嘆的實用網(wǎng)站。 該平臺致力于提供實用、相關(guān)和最新的內(nèi)容,這使其成為初學(xué)者和經(jīng)驗豐富的專業(yè)人士的寶貴資源。
聲明本文內(nèi)容來自網(wǎng)絡(luò),若涉及侵權(quán),請聯(lián)系我們刪除! 投稿需知:請以word形式發(fā)送至郵箱[email protected]
貌似在防曬………