国产精品与欧美交牲久久久久_国产精品毛片在线完整版_成人欧美在线视频_一个人看的www日本高清视频_日韩AV东北熟女_一区二区三区黄色毛片免费高清视频_亚洲欧美另类人妻_四虎精品免费视频_久久国产精品99精品国产_免费看黄片在线看

iOS開發(fā)之構(gòu)建Widget

挑戰(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è)人士的寶貴資源。

點贊(116) 打賞

聲明本文內(nèi)容來自網(wǎng)絡(luò),若涉及侵權(quán),請聯(lián)系我們刪除! 投稿需知:請以word形式發(fā)送至郵箱[email protected]

評論列表 共有 2 條評論

外用無敵膏 1年前 回復(fù)TA

貌似在防曬………

鞍山大象網(wǎng) 1年前 回復(fù)TA

我的網(wǎng)站也是這樣,已經(jīng)不存在的網(wǎng)頁還存在google的收錄中,但全部都標(biāo)為補(bǔ)充材料,想著google什么時候可以把它們?nèi)既サ舳嗪?礙眼.

立即
投稿
發(fā)表
評論
返回
頂部