国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WWDC 23 之后的 SwiftUI 有哪些新功能

這篇具有很好參考價值的文章主要介紹了WWDC 23 之后的 SwiftUI 有哪些新功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

WWDC 23 之后的 SwiftUI 有哪些新功能

前言

WWDC 23 已經(jīng)到來,SwiftUI 框架中有很多改變和新增的功能。在本文中將主要介紹 SwiftUI 中數(shù)據(jù)流動畫、ScrollView、搜索、新手勢等功能的新變化。

數(shù)據(jù)流

Swift 5.9 引入了宏功能,成為 SwiftUI 數(shù)據(jù)流的核心。SwiftUI 不再使用 Combine,而是使用新的 Observation 框架。Observation 框架為我們提供了 Observable 協(xié)議,必須使用它來允許 SwiftUI 訂閱更改并更新視圖。

@Observable
final class Store {
    var products: [String] = []
    var favorites: [String] = []
    
    func fetch() async {
        try? await Task.sleep(nanoseconds: 1_000_000_000)
        // load products
        products = [
            "Product 1",
            "Product 2"
        ]
    }
}

不需要在代碼中遵循 Observable 協(xié)議。相反,可以使用 @Observable 宏來標(biāo)記你的類型,它會自動為符合 Observable 協(xié)議。也不再需要 @Published 屬性包裝器,因為 SwiftUI 視圖會自動跟蹤任何可觀察類型的可用屬性的更改。

struct ProductsView: View {
    @State private var store = Store()
    
    var body: some View {
        List(store.products, id: \.self) { product in
            Text(verbatim: product)
        }
        .task {
            if store.products.isEmpty {
                await store.fetch()
            }
        }
    }
}

以前,有一系列的屬性包裝器,如 State、StateObject、ObservedObjectEnvironmentObject,你應(yīng)該了解何時以及為何使用它們。

現(xiàn)在,狀態(tài)管理變得更加簡單。對于值類型(如字符串和整數(shù))和符合 Observable 協(xié)議的引用類型,只需使用 State 屬性包裝器。

struct FavoriteProductsView: View {
    let store: Store
    
    var body: some View {
        List(store.favorites, id: \.self) { product in
            Text(verbatim: product)
        }
    }
}

在上面的示例中,有一個接受 Store 類型的視圖。在之前的 SwiftUI 框架版本中,應(yīng)該使用 @ObservedObject 屬性包裝器來訂閱更改?,F(xiàn)在不需要了,因為 SwiftUI 視圖會自動跟蹤符合 Observable 協(xié)議的類型的更改。

struct EnvironmentViewExample: View {
    @Environment(Store.self) private var store
    
    var body: some View {
        Button("Fetch") {
            Task {
                await store.fetch()
            }
        }
    }
}

struct ProductsView: View {
    @State private var store = Store()
    
    var body: some View {
        List(store.products, id: \.self) { product in
            Text(verbatim: product)
        }
        .task {
            if store.products.isEmpty {
                await store.fetch()
            }
        }
        .toolbar {
            NavigationLink {
                EnvironmentViewExample()
            } label: {
                Text(verbatim: "Environment")
            }
        }
        .environment(store)
    }
}

還可以使用 Environment 屬性包裝器與 environment 視圖修飾符配對,將可觀察類型放入 SwiftUI 環(huán)境中。不需要使用 @EnvironmentObject 屬性包裝器或 environmentObject 視圖修飾符。同樣的 Environment 屬性包裝器現(xiàn)在適用于可觀察類型。

struct BindanbleViewExample: View {
    @Bindable var store: Store
    
    var body: some View {
        List($store.products, id: \.self) { $product in
            TextField(text: $product) {
                Text(verbatim: product)
            }
        }
    }
}

每當(dāng)需要從可觀察類型中提取綁定時,可以使用新的 Bindable 屬性包裝器。

動畫

動畫始終是 SwiftUI 框架中最重要的部分。在 SwiftUI 中輕松實現(xiàn)任何動畫,但之前的框架版本缺少一些現(xiàn)在具有的功能。

struct AnimationExample: View {
    @State private var value = false
    
    var body: some View {
        Text(verbatim: "Hello")
            .scaleEffect(value ? 2 : 1)
            .onTapGesture {
                withAnimation {
                    value.toggle()
                } completion: {
                    print("Animation have finished")
                }
            }
    }
}

如上例所示,我們有了新版本的 withAnimation 函數(shù),允許提供動畫完成處理程序。這是一個很好的補充,現(xiàn)在您可以構(gòu)建階段性動畫。

enum Phase: CaseIterable {
    case start
    case loading
    case finish
    
    var offset: CGFloat {
        // Calculate offset for the particular phase
        switch self {
        case start: 100.0
        case loading: 0.0
        case finish: 50.0
        }
    }
}

struct PhasedAnimationExample: View {
    @State private var value = false
    
    var body: some View {
        PhaseAnimator(Phase.allCases, trigger: value) { phase in
            LoadingView()
                .offset(x: phase.offset)
        } animation: { phase in
            switch phase {
            case .start: .easeIn(duration: 0.3)
            case .loading: .easeInOut(duration: 0.5)
            case .finish: .easeOut(duration: 0.1)
            }
        }
    }
}

SwiftUI 框架引入了新的 PhaseAnimator 視圖,它遍歷階段序列,允許為每個階段提供不同的動畫,并在階段更改時更新內(nèi)容。還有 KeyframeAnimator 視圖,可以使用關(guān)鍵幀來實現(xiàn)動畫。

ScrollView

今年 ScrollView 有了很多優(yōu)秀的新增功能。首先,可以使用 scrollPosition 視圖修飾符來觀察內(nèi)容偏移量。

struct ContentView: View {
    @State private var scrollPosition: Int? = 0
    
    var body: some View {
        ScrollView {
            Button("Scroll") {
                scrollPosition = 80
            }
            
            ForEach(1..<100, id: \.self) { number in
                Text(verbatim: number.formatted())
            }
            .scrollTargetLayout()
        }
        .scrollPosition(id: $scrollPosition)
    }
}

如上例所示,使用 scrollPosition 視圖修飾符將內(nèi)容偏移量綁定到一個狀態(tài)屬性上。每當(dāng)用戶滾動視圖時,它會通過設(shè)置第一個可見視圖的標(biāo)識來更新綁定。還可以通過編程方式滾動到任何視圖,但是,應(yīng)該使用 scrollTargetLayout 視圖修飾符來告訴 SwiftUI 框架在哪里查找標(biāo)識以更新綁定。

struct ContentView: View {
    var body: some View {
        ScrollView {
            ForEach(1..<100, id: \.self) { number in
                Text(verbatim: number.formatted())
            }
            .scrollTargetLayout()
        }
        .scrollTargetBehavior(.paging)
    }
}

可以通過使用 scrollTargetBehavior 視圖修飾符來更改滾動行為。它允許在滾動視圖中啟用分頁。

搜索

與搜索相關(guān)的視圖修飾符也有一些很好的新增功能。例如,可以通過編程方式聚焦到搜索字段。

struct ProductsView: View {
    @State private var store = Store()
    @State private var query = ""
    @State private var scope: Scope = .default
    
    var body: some View {
        List(store.products, id: \.self) { product in
            Text(verbatim: product)
        }
        .task {
            if store.products.isEmpty {
                await store.fetch()
            }
        }
        .searchable(text: $query, isPresented: .constant(true), prompt: "Query")
        .searchScopes($scope, activation: .onTextEntry) {
            Text(verbatim: scope.rawValue)
        }
    }
}

如上例所示,可以使用可搜索視圖修飾符的 isPresented 參數(shù)來顯示/隱藏搜索字段。還可以使用 searchScopes 視圖修飾符的 activation 參數(shù)來定義范圍的可見性邏輯。

新手勢

新增的 RotateGestureMagnifyGesture 使我們能夠跟蹤視圖的旋轉(zhuǎn)和放大。

struct RotateGestureView: View {
    @State private var angle = Angle(degrees: 0.0)

    var rotation: some Gesture {
        RotateGesture()
            .onChanged { value in
                angle = value.rotation
            }
    }

    var body: some View {
        Rectangle()
            .frame(width: 200, height: 200, alignment: .center)
            .rotationEffect(angle)
            .gesture(rotation)
    }
}

新增的小功能

增加了全新的 ContentUnavailableView 類型,當(dāng)需要顯示空視圖時可以使用它。示例如下:

struct ProductsView: View {
    @State private var store = Store()
    
    var body: some View {
        List(store.products, id: \.self) { product in
            Text(verbatim: product)
        }
        .background {
            if store.products.isEmpty {
                ContentUnavailableView("Products list is empty", systemImage: "list.dash")
            }
        }
        .task {
            if store.products.isEmpty {
                await store.fetch()
            }
        }
    }
}

還有新增了新的視圖修飾符,允許調(diào)整列表中的間距??梢允褂?listRowSpacinglistSectionSpacing 視圖修飾符來設(shè)置列表中所需的間距。EnvironmentValues 結(jié)構(gòu)體包含了一系列與最新平臺更新相關(guān)的新屬性,例如 isActivityFullscreenshowsWidgetContainerBackground。Swift Charts 也具有可滾動和可動畫的功能。

#Preview {
    ContentView()
}

還有一個新的 Preview 宏,可以讓我們輕松地為 UIKit 和 SwiftUI 構(gòu)建預(yù)覽,只需幾行代碼。

總結(jié)

SwiftUI 框架中有許多小的新增功能,我們將會繼續(xù)分享。希望能幫到你。

特別感謝 Swift社區(qū) 編輯部的每一位編輯,感謝大家的辛苦付出,為 Swift社區(qū) 提供優(yōu)質(zhì)內(nèi)容,為 Swift 語言的發(fā)展貢獻(xiàn)自己的力量。文章來源地址http://www.zghlxwxcb.cn/news/detail-477284.html

到了這里,關(guān)于WWDC 23 之后的 SwiftUI 有哪些新功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • After Effects 2023發(fā)布,有哪些值得關(guān)注的新功能?

    After Effects 2023發(fā)布,有哪些值得關(guān)注的新功能?

    After Effects 2023 (版本 23.4) 發(fā)布 有哪些值得關(guān)注的新功能?AE2023改進(jìn)了用戶請求的工作流程并進(jìn)行了重要修復(fù),用戶可在 After Effects 中更高效地工作,在不影響創(chuàng)意構(gòu)想的情況下設(shè)計更加優(yōu)質(zhì)的細(xì)節(jié)。 AE2023 for Mac AE2023 新增功能如下: 文本和形狀圖層的“屬性”面板 可在易于

    2024年02月09日
    瀏覽(26)
  • MySQL 8.1正式發(fā)行!有哪些值得關(guān)注的新功能?

    MySQL 8.1正式發(fā)行!有哪些值得關(guān)注的新功能?

    千呼萬喚始出來的新版本MySQL 8.1及MySQL 8.0.34于2023年7月18日正式發(fā)行。從此,MySQL將開啟創(chuàng)新版和穩(wěn)定版同時發(fā)行的階段。MySQL 8.1是MySQL的首個創(chuàng)新版,該版本主要增加了如下功能: ? 捕捉EXPLAIN FORMAT=JSON輸出, 為 EXPLAIN FORMAT=JSON 增加 INTO 選項,可以將JSON格式的輸出保存在一個

    2024年02月15日
    瀏覽(18)
  • 今天新發(fā)布的nova12手機(jī)都有哪些新功能?

    今天新發(fā)布的nova12手機(jī)都有哪些新功能?

    12月26日,華為召開問界M9及華為冬季全場景發(fā)布會,正式推出了華為nova 12系列新品,并宣布新的三款nova產(chǎn)品正式加入先鋒計劃~我們一起看下這次華為nova12系列有那些看點亮點呢?首先這次nova12 ultra 配置很高啊,智能可變光圈,雙向北斗衛(wèi)星消息,智感支付、智能快充10分鐘快

    2024年02月03日
    瀏覽(28)
  • Microsoft365有用嗎?2023最新版office有哪些新功能?

    Microsoft365有用嗎?2023最新版office有哪些新功能?

    office自97版到現(xiàn)在已有20多年,一直是作為行業(yè)標(biāo)準(zhǔn),格式和兼容性好,比較正式,適合商務(wù)使用。包含多個組件,除了常用的word、excel、ppt外,還有收發(fā)郵件的outlook、管理數(shù)據(jù)庫的access、排版桌面的publisher等,功能較為全面。 Microsoft 365 內(nèi)含你喜歡的各種 Office 365 內(nèi)容以及

    2024年02月11日
    瀏覽(18)
  • CorelDRAW2023新功能有哪些?最新版cdr下載安裝教程

    CorelDRAW2023新功能有哪些?最新版cdr下載安裝教程

    使用 CorelDRAW2023,隨時隨都能進(jìn)行設(shè)計創(chuàng)作。在 Windows或Mac上使用專為此平臺設(shè)計的直觀界面,以自己的風(fēng)格盡情自由創(chuàng)作。同全球數(shù)百萬信賴CorelDRAW Graphics Suite 的藝術(shù)家、設(shè)計者及小型企業(yè)主一樣,大膽展現(xiàn)真我,創(chuàng)作出眾的創(chuàng)意作品。上半年又出了CorelDRAW 2023(25.1.1.328)

    2024年02月16日
    瀏覽(29)
  • GPT-5不叫GPT-5?下一代模型會有哪些新功能?

    GPT-5不叫GPT-5?下一代模型會有哪些新功能?

    OpenAI首席執(zhí)行官 奧特曼在上周三達(dá)沃斯論壇接受媒體采訪時表示,他現(xiàn)在的首要任務(wù)就是推出下一代大模型,這款模型不一定會命名GPT-5。雖然GPT-5的商標(biāo)早已經(jīng)注冊。 如果GPT-4目前解決了人類任務(wù)的10%,GPT-5應(yīng)該是 15%或者20% 。 OpenAI 從去年開始訓(xùn)練GPT-5,奧特曼透露,GPT-5目

    2024年01月24日
    瀏覽(42)
  • C++11 新功能

    C++11 新功能

    在2003年C++標(biāo)準(zhǔn)委員會曾經(jīng)提交了一份技術(shù)勘誤表(簡稱TC1),使得C++03這個名字已經(jīng)取代了C++98稱為 C++11之前的最新C++標(biāo)準(zhǔn)名稱。不過由于TC1主要是對C++98標(biāo)準(zhǔn)中的漏洞進(jìn)行修復(fù),語言的核心部分則沒 有改動,因此人們習(xí)慣性的把兩個標(biāo)準(zhǔn)合并稱為C++98/03標(biāo)準(zhǔn)。從C++0x到C++11,C+

    2023年04月12日
    瀏覽(29)
  • Java 20 新功能介紹

    Java 20 共帶來 7 個新特性功能 ,其中三個是孵化提案,孵化也就是說尚在征求意見階段,未來可能會刪除此功能。 JEP 描述 分類 429 作用域值(孵化器) Project Loom,Java 開發(fā)相關(guān) 432 Record 模式匹配(第二次預(yù)覽) Project Amber,新的語言特性 433 switch 的模式匹配(第四次預(yù)覽)

    2024年02月03日
    瀏覽(26)
  • Midjourney新功能:角色參照指南

    基本概念 角色參照(Character Reference) :這個功能允許用戶在不同的圖像生成中保持給定參照角色的一致性。 適用模型 :適用于Midjourney V6和Niji6型號。 功能亮點 跨風(fēng)格一致性 :可以在不同風(fēng)格(如動漫風(fēng)、寫實風(fēng))中保持角色特征一致。 面部、著裝、發(fā)型調(diào)控 :用戶可以

    2024年04月10日
    瀏覽(43)
  • 【C++】C++11 -- 新功能

    在C++11之前一個類有6個默認(rèn)成員函數(shù),在C++11標(biāo)準(zhǔn)中又新增了兩個默認(rèn)成員函數(shù),分別是移動構(gòu)造函數(shù)和移動賦值函數(shù) 默認(rèn)移動構(gòu)造和移動賦值生成的條件 移動構(gòu)造函數(shù)的生成條件:沒有自己實現(xiàn)移動構(gòu)造函數(shù),并且沒有自己實現(xiàn)析構(gòu)函數(shù),拷貝構(gòu)造函數(shù)和拷貝賦值函數(shù) 移

    2024年02月17日
    瀏覽(52)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包