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

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

挑戰(zhàn)接受!話說(shuō)最近圍繞著Widget的話題可真是熱熱鬧鬧??!相信各位腕上功夫高超的大佬們已經(jīng)津津有味的把Widget搞起來(lái),有沒(méi)有搞得挺過(guò)癮的感覺(jué)?那對(duì)于還在Widget上懵懵懂懂的小白們來(lái)說(shuō),不要慌,我來(lái)給你帶來(lái)一場(chǎng)Widget的構(gòu)建之旅~

Widget這個(gè)東西,在iOS14上被蘋(píng)果官方推出來(lái)了,也就是說(shuō),新的Widget視圖可以顯示在用戶(hù)的主屏幕上了,豐富了iOS系統(tǒng)的形態(tài)。以前呢,我們只有在通知中心中看到過(guò)Widget,iOS14中的Widget可以顯示在桌面上了,但是有一個(gè)限制——最多只能放置10個(gè)同類(lèi)型(大小不同,大的和小的算兩個(gè))的Widget。不過(guò),這完全不影響我們嗨皮構(gòu)建Widget呀!

首先呢,我們得創(chuàng)建一個(gè)Widget Extension目標(biāo)。步驟如下:

- 打開(kāi)Xcode,然后選擇File -> New -> Target。

- 在展開(kāi)的菜單中,找到Application Extension,然后點(diǎn)擊下面的Widget Extension。

- 按下Next,輸入Product Name ,可選擇相關(guān)的 Group,再按Create,此時(shí)Xcode會(huì)自動(dòng)生成 Widget Extension 代碼結(jié)構(gòu)。

除此之外,我們還需要對(duì)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("這是一個(gè)自定義小組件") }

}

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)建一個(gè)簡(jiǎn)單的Widget,你可以根據(jù)自己的需求進(jìn)行修改。其中:

- MyAppWidgetView:是Widget中的View,用來(lái)展示widget的樣式,響應(yīng)事件,可視為一個(gè)自定義的小組件。

- MyProvider:插件提供程序,用于提供有關(guān)小組件的信息,比如占位符,快照和時(shí)間軸數(shù)據(jù)。

Widget中有幾個(gè)屬性值,我們可以自己設(shè)置,分別如下:

- var widgetFamily: @WidgetFamily :當(dāng)前的Widget的類(lèi)型,目前有三種:systemSmall、systemMedium、systemLarge,分別表示簡(jiǎn)約型、中等型、詳細(xì)型。

- var body: Body :主要內(nèi)容,是一個(gè)AnyView類(lèi)型的值,這意味著你可以返回任何的類(lèi)型作為主要內(nèi)容,包括文字、圖片、按鈕等等。

而且,除此之外,我們還可以把小組件設(shè)置成動(dòng)態(tài)類(lèi)型的Widget。動(dòng)態(tài)類(lèi)型的Widget意味著視圖在不同的狀態(tài)下會(huì)呈現(xiàn)不同的內(nèi)容。所以我們還需要 TimelineProvider 和 TimelineEntry。

TimelineProvider:提供時(shí)間軸支持來(lái)展示動(dòng)態(tài)Widget的更新數(shù)據(jù)的可演變過(guò)程,主要功能是獲取用于更新小組件的數(shù)據(jù)。

TimelineEntry:構(gòu)建數(shù)據(jù)源模型的內(nèi)容,它有三個(gè)參數(shù):

- date:時(shí)間datetime類(lèi)型的,表示數(shù)據(jù)的生成時(shí)間;

- relevance:數(shù)據(jù)時(shí)效性相關(guān),和date一起使用;

- content:小組件的內(nèi)容,參數(shù)可以是任何小組件。

呼~(yú)~~深呼吸,是不是有點(diǎn)看不懂了?別著急,我們還是直接看一下代碼:

```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("這是一個(gè)自定義小組件")

}

}

//TimelineProvider適用于具有周期更新行為的Widget

struct MyProvider: TimelineProvider {

//定義一個(gè)返回PlaceholderEntry類(lèi)型元素的函數(shù)

func placeholder(in context: Context) -> MyEntry {

MyEntry(date: Date(), relevance: nil, text: "占位")

}

//.systemSmall為Static Configuration下的子配置項(xiàng)

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í)前的數(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ù)提供者,在初始化,快照視圖和時(shí)間軸更新中生成Widget的初始狀態(tài)。

- TimelineProvider、TimelineEntry:此處涉及到了數(shù)據(jù)的更新,在getTimeline() 方法中每小時(shí)更新一次數(shù)據(jù),共更新五次。而MyEntry則是每次更新所包含的數(shù)據(jù)內(nèi)容,這里我們只包含一個(gè)text屬性。

好了,到這里,我們就介紹完了包含構(gòu)建靜態(tài)Widget和動(dòng)態(tài)Widget的全部?jī)?nèi)容。如果你還不理解或者有疑問(wèn),可以再看看代碼或者私信我哦~(BuildContext) www.yinyiprinting.cn 寧波海美seo網(wǎng)絡(luò)優(yōu)化公司 是網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站優(yōu)化,企業(yè)關(guān)鍵詞排名,網(wǎng)絡(luò)營(yíng)銷(xiāo)知識(shí)和開(kāi)發(fā)愛(ài)好者的一站式目的地,提供豐富的信息、資源和工具來(lái)幫助用戶(hù)創(chuàng)建令人驚嘆的實(shí)用網(wǎng)站。 該平臺(tái)致力于提供實(shí)用、相關(guān)和最新的內(nèi)容,這使其成為初學(xué)者和經(jīng)驗(yàn)豐富的專(zhuān)業(yè)人士的寶貴資源。

點(diǎn)贊(116) 打賞

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

評(píng)論列表 共有 2 條評(píng)論

外用無(wú)敵膏 2年前 回復(fù)TA

貌似在防曬………

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

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

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