精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

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

前言

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

數據流

Swift 5.9 引入了宏功能,成為 SwiftUI 數據流的核心。SwiftUI 不再使用 Combine,而是使用新的 Observation 框架。Observation 框架為我們提供了 Observable 協議,必須使用它來允許 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 協議。相反,可以使用 @Observable 宏來標記你的類型,它會自動為符合 Observable 協議。也不再需要 @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、ObservedObject 和 EnvironmentObject,你應該了解何時以及為何使用它們。

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

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

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

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 環境中。不需要使用 @EnvironmentObject 屬性包裝器或 environmentObject 視圖修飾符。同樣的 Environment 屬性包裝器現在適用于可觀察類型。

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

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

動畫

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

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 函數,允許提供動畫完成處理程序。這是一個很好的補充,現在您可以構建階段性動畫。

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 視圖,它遍歷階段序列,允許為每個階段提供不同的動畫,并在階段更改時更新內容。還有 KeyframeAnimator 視圖,可以使用關鍵幀來實現動畫。

ScrollView

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

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 視圖修飾符將內容偏移量綁定到一個狀態屬性上。每當用戶滾動視圖時,它會通過設置第一個可見視圖的標識來更新綁定。還可以通過編程方式滾動到任何視圖,但是,應該使用 scrollTargetLayout 視圖修飾符來告訴 SwiftUI 框架在哪里查找標識以更新綁定。

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

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

搜索

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

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 參數來顯示/隱藏搜索字段。還可以使用 searchScopes 視圖修飾符的 activation 參數來定義范圍的可見性邏輯。

新手勢

新增的 RotateGesture 和 MagnifyGesture 使我們能夠跟蹤視圖的旋轉和放大。

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 類型,當需要顯示空視圖時可以使用它。示例如下:

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()
            }
        }
    }
}

還有新增了新的視圖修飾符,允許調整列表中的間距。可以使用 listRowSpacing 和 listSectionSpacing 視圖修飾符來設置列表中所需的間距。EnvironmentValues 結構體包含了一系列與最新平臺更新相關的新屬性,例如 isActivityFullscreen 和 showsWidgetContainerBackground。Swift Charts 也具有可滾動和可動畫的功能。

#Preview {
    ContentView()
}

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

總結

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

責任編輯:武曉燕 來源: Swift社區
相關推薦

2024-06-25 09:05:09

SwiftUIUIKitEntry

2025-05-13 03:00:00

SQLarkPostgreSQL

2022-02-16 23:11:04

iOS蘋果功能

2020-12-07 05:47:47

VCF 4.0虛擬化

2020-09-01 10:16:03

Windows 10Windows 10 微軟

2010-07-23 09:53:29

SQL Server

2010-04-01 09:03:31

RHEL 5.5

2020-07-08 15:12:29

iOSIpad OS蘋果

2021-08-19 09:37:06

Go 1.17語言架構

2010-04-22 10:01:44

Oracle收購SUN

2015-06-10 16:23:33

WWDC庫克蘋果

2020-02-20 16:30:22

iOS 13.4蘋果iPhone

2010-08-26 15:22:36

DB2新功能

2021-08-02 15:28:58

iOS蘋果系統

2011-02-28 17:41:20

SQL Server

2020-11-09 07:15:51

Fedora 33WorkstationLinux

2009-06-19 12:53:56

Spring 2.0

2020-10-24 17:52:10

工業物聯網IIOT物聯網

2020-08-16 09:25:21

Windows 10Windows操作系統

2015-08-17 11:30:51

點贊
收藏

51CTO技術棧公眾號

欧美亚洲国产成人| 日本精品视频在线播放| 性高潮久久久久久| a级片在线免费| 在线一区二区不卡| 超黄网站在线观看| 国产精品视频免费看| 91日韩久久| 老熟妇仑乱一区二区av| 亚洲乱码精品| 亚洲欧美在线一区二区| 午夜诱惑痒痒网| 成人免费看视频网站| 亚洲美女精品一区| 日韩电影大全在线观看| 国产1区在线观看| 麻豆91精品视频| 97视频国产在线| 五月天激情丁香| 免费精品国产| 精品国产乱码久久| jizzzz日本| 天天综合av| 一个色在线综合| 亚洲午夜精品一区二区三区| 性高潮久久久久久久久久| 国产久卡久卡久卡久卡视频精品| 国产成人短视频| 日韩精品视频免费播放| 欧美 日韩 国产一区二区在线视频| 亚洲人永久免费| 制服丝袜av在线| 电影一区二区三区久久免费观看| 色天天综合色天天久久| 欧美视频在线观看网站| 欧美人与禽性xxxxx杂性| 国产精品成人免费精品自在线观看 | 免费精品视频一区| 神马久久久久久久久久| 国产成人av福利| 成人a在线观看| 亚洲 小说区 图片区| 午夜亚洲视频| 欧美一性一乱一交一视频| 国产精品美女毛片真酒店| 欧美黄色一级视频| 另类视频在线观看| 欧美一级片在线视频| 欧美激情欧美| 日韩中文字幕在线视频播放| 国产黄色片在线| 成人在线免费观看视频| 色偷偷综合社区| 91禁男男在线观看| 97欧美在线视频| 两个人的视频www国产精品| 四虎地址8848| 性欧美欧美巨大69| 精品中文字幕乱| 久久午夜无码鲁丝片| 国产精品激情电影| 97色在线播放视频| 亚洲欧美偷拍一区| 奇米四色…亚洲| 成人免费视频网址| 国产视频第二页| 大白屁股一区二区视频| 国产日韩欧美一区二区| 欧美91精品久久久久国产性生爱| 久久综合色鬼综合色| 日韩影院一区| 国产在线观看免费麻豆| 亚洲综合色丁香婷婷六月图片| 日韩国产成人无码av毛片| mm视频在线视频| 色综合天天综合网天天狠天天| 天天操天天爱天天爽| 日韩毛片免费看| 精品乱码亚洲一区二区不卡| 久久久久久久人妻无码中文字幕爆| 色婷婷狠狠五月综合天色拍 | 毛片在线播放a| 亚洲男女毛片无遮挡| 日本国产在线播放| 国产91精品在线| 日韩欧美一级二级| 一起草在线视频| 日韩a一区二区| 欧美大片网站在线观看| 东京热一区二区三区四区| 免费人成精品欧美精品| 成人自拍网站| 春暖花开成人亚洲区| 一区二区三区中文字幕电影 | 亚洲片av在线| 乱h高h女3p含苞待放| 亚洲国产综合在线看不卡| 国产精品爽爽爽| 日本xxxxwww| 国产精品女同互慰在线看| 免费人成自慰网站| 免费一区二区三区四区| 成人高清免费在线| 国产日韩欧美一区二区三区乱码| 久久最新免费视频| 性欧美又大又长又硬| 91麻豆精品91久久久久同性| 亚洲乱码国产乱码精品精大量| 99九九热只有国产精品| 欧美在线www| 亚洲av永久纯肉无码精品动漫| 99re亚洲国产精品| 亚洲精品免费在线看| 极品在线视频| 日韩你懂的电影在线观看| av永久免费观看| 99热这里只有精品8| 3d动漫精品啪啪一区二区三区免费| 国产精品久久久久一区二区国产 | av大片免费观看| 国产在线播放一区| 亚洲国产精品一区二区第一页| 毛片电影在线| 欧美tickling挠脚心丨vk| 自拍偷拍第9页| 日本午夜一区二区| 免费在线国产精品| 狼人综合视频| 精品va天堂亚洲国产| 69xx绿帽三人行| 无尽裸体动漫2d在线观看| 天堂av8在线| 日韩精品免费一区二区夜夜嗨| 欧美成人免费在线观看| 一级黄色片视频| 亚洲国产岛国毛片在线| 国产精品天天av精麻传媒| 欧美黑人做爰爽爽爽| 韩国精品美女www爽爽爽视频| 国产精品爽爽久久| 国产精品久久久久久福利一牛影视| 99视频在线免费| 久久综合影院| 国产成人精品一区| 国产最新视频在线观看| 色8久久精品久久久久久蜜| 国产ts丝袜人妖系列视频| 国产精品久久777777毛茸茸 | 亚洲一区二区精品久久av| 波多野结衣电影免费观看| 亚洲女同中文字幕| 亚洲一区二区三区成人在线视频精品| 蜜桃视频在线观看www社区| 欧美情侣在线播放| 国产黄色小视频网站| 国产美女视频一区| 国产1区2区3区中文字幕| 中文字幕区一区二区三| 午夜精品视频在线| 日本私人网站在线观看| 欧美综合在线视频| 看黄色录像一级片| 国产成人午夜视频| 草b视频在线观看| 五月综合久久| 中文字幕一区二区三区四区不卡| 国产精品视频自在线| 日本网站在线免费观看视频| 欧美人与性动xxxx| 少妇影院在线观看| 99天天综合性| 亚洲精品高清无码视频| 欧美黄色大片在线观看| 97超级碰碰| 在线天堂中文资源最新版| 中文字幕成人精品久久不卡| 国产女人18毛片水18精| 性感美女久久精品| 国产精品成人无码免费| 国产精品1024久久| 欧美 日韩 国产在线观看| 欧洲杯足球赛直播| 操一操视频一区| 666av成人影院在线观看| xxx欧美精品| 天堂中文在线观看视频| 欧美亚洲国产一区二区三区 | 福利一区福利二区微拍刺激| 亚洲毛片亚洲毛片亚洲毛片| 国产成人在线看| 成年人在线观看视频免费| 一区二区在线影院| 蜜桃视频成人| 亚洲成人黄色| 国产日韩精品视频| 麻豆蜜桃在线观看| 欧美成人一区二区三区电影| 日本天堂影院在线视频| 日韩欧美不卡在线观看视频| 亚洲午夜无码久久久久| 亚洲va国产天堂va久久en| 刘亦菲国产毛片bd| 2021国产精品久久精品| 99热这里只有精品2| 三级久久三级久久久| 精品国偷自产一区二区三区| 欧美独立站高清久久| 久久综合一区| 国产成人高清精品免费5388| 国产精选久久久久久| 亚洲风情在线资源| 欧美激情视频网站| 黄色网址在线免费播放| 一区二区三区久久精品| 五月婷婷免费视频| 日韩欧美一区在线观看| 在线观看国产一区二区三区| 色哟哟国产精品免费观看| 国产真实的和子乱拍在线观看| 亚洲欧美综合另类在线卡通| www亚洲色图| 久久午夜老司机| 少妇激情一区二区三区视频| 国产成人午夜精品5599| 免费不卡av网站| 久久99久久久久久久久久久| 狠狠操精品视频| 久久激情久久| 国产精品沙发午睡系列| 激情婷婷亚洲| 亚洲 欧美 综合 另类 中字| 在线国产一区二区| 宅男av一区二区三区| 欧美日韩高清| 亚洲国产精品123| 第一会所亚洲原创| 午夜精品美女久久久久av福利| 九九在线精品| 日本欧美精品久久久| 男男gay无套免费视频欧美| 久久亚洲高清| 久久91麻豆精品一区| 欧美精品七区| 国产精品一区二区三区av麻| 欧美一区二区三区四区五区六区| 免费成人网www| 日本不卡在线播放| 日韩一区二区在线| 中国成人在线视频| 国产精品二区不卡| 国内自拍中文字幕| 国模吧视频一区| 日本韩国欧美在线观看| 国产欧美大片| 国产一级不卡毛片| 蜜臀av国产精品久久久久| 中文字幕亚洲欧洲| 国产资源精品在线观看| 国产成人精品综合久久久久99| 国产a级毛片一区| 国产亚洲无码精品| 久久九九久久九九| 亚洲欧美另类日本| 一区二区三区四区视频精品免费 | 国产午夜精品理论片| 亚洲欧美日韩一区| 在线看成人av| 色哟哟在线观看一区二区三区| 国产在线一级片| 欧美一区二区在线视频| 成人毛片视频免费看| 精品一区电影| 欧美最猛性xxxx| 成人在线高清| 99久热re在线精品视频| 青青一区二区| 一区二区av| 在线国产欧美| 在线观看免费黄网站| 国产精品白丝jk黑袜喷水| 国产一级伦理片| 国产精品美日韩| 国产 日韩 欧美 成人| 日本韩国视频一区二区| 国产绳艺sm调教室论坛| 国产婷婷色综合av蜜臀av | 蜜桃一区av| 亚洲一区二区三区加勒比 | 欧美精品激情视频| 日韩电影av| www日韩av| 日韩a一区二区| 国产午夜福利100集发布| 免费成人美女在线观看.| 中文字幕永久免费| 中文字幕的久久| 国产精品第九页| 欧美日本一道本在线视频| 天天色天天操天天射| 久久视频在线播放| 午夜欧美巨大性欧美巨大 | 久久精品久久99| 337p粉嫩大胆噜噜噜噜噜91av| 波多野结衣久久久久| 欧美视频在线免费看| www.国产免费| 日韩视频在线一区| 亚洲伊人av| 国产精品国产三级欧美二区| 天天综合网91| 国产一级特黄a大片免费| av在线不卡观看免费观看| 三级在线观看免费大全| 日本韩国一区二区三区| 五月天婷婷在线播放| 久久免费观看视频| 精品国产一级| 99re99热| 美女视频黄频大全不卡视频在线播放| 欧美熟妇精品黑人巨大一二三区| 一区二区三区 在线观看视频| 91九色蝌蚪91por成人| 国产一区二区精品丝袜| 自由日本语热亚洲人| 极品尤物一区二区三区| 国产一区美女| 欧美xxxx日本和非洲| 最新欧美精品一区二区三区| 怡红院男人天堂| 亚洲免费伊人电影在线观看av| 精品三级久久| 国产精品久久久久久久久久久久午夜片| 亚洲乱码在线| 在线观看网站黄| 一区二区三区久久久| 国产视频一区二区三区四区五区 | av资源网在线播放| 成人一区二区三区四区| 欧美日韩mv| 波多野结衣三级视频| 亚洲主播在线播放| 丰满岳乱妇国产精品一区| 欧美精品精品精品精品免费| 国产精区一区二区| 警花观音坐莲激情销魂小说| 国产福利精品一区二区| 欧美成人免费看| 精品久久久网站| 欧美13videosex性极品| 久久精品国产一区二区三区日韩| 亚洲一区日韩在线| 麻豆国产精品一区| 在线欧美小视频| 日本不卡三区| 91免费在线视频| 国产精品豆花视频| 97人妻精品一区二区三区免| 欧美性猛交99久久久久99按摩| 男女污污视频在线观看| 国产精品狼人色视频一区| 国产精品麻豆久久| 亚洲国产精品第一页| 精品美女久久久久久免费| 成人影视在线播放| 91精品久久久久久久久久入口| 一区二区三区中文| 精品熟女一区二区三区| 91成人网在线| 国产原厂视频在线观看| 高清不卡一区二区三区| 性一交一乱一区二区洋洋av| 老司机福利在线观看| 日韩三级免费观看| 色多多在线观看| 一区二区三区四区国产| 成人中文字幕电影| 久久久久久久久久成人| 久久成人精品视频| 亚洲国产最新| av中文字幕网址| 午夜精品久久久久| 在线国产91| 国产伦精品一区二区三| 蜜臀av一区二区在线免费观看| 黄色一级免费视频| 曰本色欧美视频在线| 欧美日韩黄网站| 美女喷白浆视频| 亚洲一区二区三区四区五区黄| 国产三级视频在线| 高清不卡日本v二区在线| 免费人成在线不卡| 国产午夜在线播放| 成人深夜福利app| 欧美精品色婷婷五月综合| 欧美激情中文不卡| 日本免费一区视频| 91美女福利视频高清| 久久精品亚洲| 成人免费看片98|