精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美xxxx黑人| 久久久久久久久网| www.av88| 亚洲精品二区三区| 亚洲国产欧美一区二区三区同亚洲| 日韩精品福利片午夜免费观看| 男人天堂av网| 免费欧美在线视频| 欧美极品第一页| 播金莲一级淫片aaaaaaa| 高清av一区二区三区| 亚洲欧美日韩一区二区| eeuss一区二区三区| 国产一卡二卡三卡| 韩国av一区| 亚洲欧洲激情在线| 制服下的诱惑暮生| 88xx成人网| 亚洲成在线观看| 亚洲一区三区| 人成免费电影一二三区在线观看| 久久精品99国产国产精| 97成人精品区在线播放| 国产sm调教视频| 欧美aaaaaaaa牛牛影院| 欧美日韩亚洲国产综合| 国产伦精品一区二区三区四区视频_| 国产高清免费在线播放| 成人高清视频在线| 亚洲最大av在线| 日韩黄色片网站| 亚洲精品麻豆| 欧美成人免费观看| 成人欧美一区二区三区黑人一| 日本欧美三级| 亚洲第一网站男人都懂| 亚洲欧美一区二区三区不卡| 中文字幕系列一区| 色婷婷一区二区| 男女私大尺度视频| 黄色污污视频在线观看| 中文字幕中文乱码欧美一区二区| 欧美成人免费在线| 无码国产色欲xxxx视频| 成人午夜视频网站| 99精品国产一区二区| 国产精品福利电影| 蜜桃av一区二区在线观看| 日本a级片电影一区二区| 亚洲激情视频一区| 激情久久一区| 国内外成人免费激情在线视频| 国内偷拍精品视频| 亚洲乱码电影| 蜜月aⅴ免费一区二区三区| 色偷偷男人天堂| 日韩中文在线电影| 色妞欧美日韩在线| 四虎影视一区二区| 亚洲啊v在线观看| 美日韩精品免费视频| 久热这里有精品| 中文精品电影| 欧美国产日韩在线| 精品一级少妇久久久久久久| 午夜欧美精品久久久久久久| 欧美国产视频一区二区| 日韩精品人妻中文字幕| 亚洲激情二区| 欧美一区二区色| 中文字幕手机在线视频| 热久久一区二区| 成人两性免费视频| www三级免费| www.亚洲精品| 欧美精品亚洲精品| 在线观看黄av| 一区二区欧美视频| 国产精品专区在线| 电影久久久久久| 91精品一区二区三区久久久久久| 美女日批在线观看| 日本成人7777| 日韩视频―中文字幕| 国产天堂av在线| 亚洲国产美女 | 少妇精品一区二区三区| 国模精品一区| 日韩色av导航| 日韩av片在线播放| 蜜桃视频在线一区| 国产精品国产三级欧美二区| 欧美日韩国产中文字幕在线| 国产欧美日韩在线| 无颜之月在线看| 美女福利一区二区三区| 91精品国产乱| 中文字幕一区二区人妻在线不卡 | 精品久久免费观看| 91超碰在线播放| 欧美日韩国产一级| 国产精品福利导航| 中文字幕一区二区三区久久网站 | 日韩精品一区二区三区第95| 天天躁夜夜躁狠狠是什么心态| 久久精品久久久| 欧美亚洲第一区| 精品国产av鲁一鲁一区| 久久久精品天堂| 欧美久久在线观看| 青草综合视频| 亚洲欧美日韩国产精品| 青青草原在线免费观看| 日韩国产在线观看| 国产欧美日韩一区| 黄色av电影在线播放| 色悠悠亚洲一区二区| 特种兵之深入敌后| 色999日韩| 国产97在线|日韩| 黄色www视频| 18成人在线视频| 亚洲 欧美 日韩系列| 欧美日韩另类图片| 欧美精品videofree1080p| 亚洲天堂视频网| 2024国产精品视频| 少妇高潮大叫好爽喷水| 成人黄色毛片| 国产一区二区三区视频在线观看| 亚洲第一精品在线观看| 国产成人亚洲综合a∨猫咪| 亚洲资源在线网| 秋霞国产精品| 亚洲人成在线播放| 特级西西444www大精品视频免费看| 国产成人精品1024| 九一免费在线观看| 日韩精品一区二区三区中文| 在线日韩中文字幕| 一级久久久久久| 久久精品欧美日韩| 欧美极品欧美精品欧美图片| 欧美wwwwww| 久久久免费av| 日韩一级片免费观看| 亚洲综合丁香婷婷六月香| 国内精品国产三级国产aⅴ久| 国产精品二区不卡| 成人激情视频网| 国产欧美黑人| 欧美一区二区黄| 69av视频在线| 国产成人av电影免费在线观看| 在线观看欧美亚洲| 国产激情综合| 成人97在线观看视频| 国产精品久久久久久无人区| 亚洲人成在线观看一区二区| www.色就是色.com| 国内精品久久久久久久影视蜜臀 | 伊人开心综合网| 岛国大片在线免费观看| 亚洲美女91| 欧美日韩大片一区二区三区| 欧美激情喷水| 日韩最新免费不卡| 性猛交富婆╳xxx乱大交天津| 亚洲五月六月丁香激情| 精品熟女一区二区三区| 免费日韩视频| 亚洲一卡二卡三卡四卡无卡网站在线看| 成人全视频免费观看在线看| 日韩一区二区三区xxxx| 精品女同一区二区三区| 亚洲福利一二三区| 日韩女同一区二区三区| 国产一区999| 欧美啪啪免费视频| 久久在线视频免费观看| 99国产超薄丝袜足j在线观看 | 亚洲国产wwwccc36天堂| 泷泽萝拉在线播放| 精品在线亚洲视频| 国产午夜福利100集发布| 欧美精品尤物在线观看| 亚洲专区中文字幕| 中文字幕在线中文字幕在线中三区| 亚洲图中文字幕| 亚洲av无码乱码国产精品久久 | 国产成人精品一区二区色戒| 亚洲欧美日韩人成在线播放| 国产精品成人99一区无码| 日韩avvvv在线播放| 国产在线观看欧美| 欧美午夜精彩| 国产精品免费在线| 欧美日韩尤物久久| 午夜精品免费视频| 国产精品实拍| 亚洲欧美日韩中文在线| 国产福利视频导航| 在线这里只有精品| 伊人国产在线观看| 中文字幕一区二区日韩精品绯色| 亚洲av成人精品一区二区三区| 日本亚洲免费观看| 精品少妇一区二区三区在线| 91亚洲国产| 欧美日韩国产三区| 亚洲一级大片| 成人黄色激情网| 精品亚洲美女网站| 91精品国产乱码久久久久久蜜臀| 国产高清一区二区三区视频| 精品丝袜一区二区三区| 不卡视频在线播放| 欧美精品在线视频| 无码人妻丰满熟妇奶水区码| 一区二区激情小说| 黄视频网站免费看| 欧美国产精品专区| 黄色aaa视频| 9色porny自拍视频一区二区| 韩国三级丰满少妇高潮| 奇米影视一区二区三区小说| 亚洲自偷自拍熟女另类| 国一区二区在线观看| 六月婷婷激情网| 亚洲老妇激情| 黄色一级视频播放| 91综合久久一区二区| 日韩精品一区二区三区丰满 | 国产在线精品免费| 激情五月俺来也| 日韩精品电影在线| 激情婷婷综合网| 久久综合亚州| 午夜激情在线观看视频| 久久精品麻豆| 99999精品视频| 欧美亚洲一级| 中文字幕人成人乱码亚洲电影| 亚洲精品少妇30p| 日本高清不卡免费| 亚洲私人黄色宅男| 黄色录像二级片| 亚洲欧美另类在线| 青青草国产在线观看| 亚洲女人的天堂| 欧产日产国产v| 亚洲最大成人综合| 日本少妇裸体做爰| 色综合久久久久综合99| 天天操夜夜操视频| 91国偷自产一区二区三区观看| 免费无码国产精品| 欧美日韩黄色影视| 国产男男gay体育生白袜| 日韩欧美综合一区| 国产 欧美 自拍| 亚洲精品视频二区| 91欧美在线视频| 久久久黄色av| 99热99re6国产在线播放| 57pao精品| 亚洲精品555| 91在线观看免费观看| xvideos.蜜桃一区二区| 久久大片网站| 成人一区不卡| 国产精品88久久久久久妇女| 国产综合自拍| 成人免费无码av| 精品一区二区av| 亚洲av成人无码一二三在线观看| 91啪亚洲精品| 色哟哟一一国产精品| 亚洲综合在线第一页| 天堂网av手机版| 欧美午夜电影网| 午夜精品久久久久久久99| 亚洲精品久久久久久久久久久| 国产视频精品久久| 欧美猛交ⅹxxx乱大交视频| 麻豆mv在线观看| 国产精品亚洲网站| 国产日韩三级| 亚洲韩国在线| 一本色道久久综合亚洲精品不卡 | 美女网站视频在线| 国产精品jizz在线观看麻豆| 99久久999| 欧美少妇一区| 国产在线成人| 色综合色综合色综合色综合| 成人污视频在线观看| 日本高清黄色片| 婷婷久久综合九色综合绿巨人| 中文字幕+乱码+中文字幕明步| 欧美成人a∨高清免费观看| 国产小视频免费在线观看| 欧美大片免费看| 日韩久久99| 欧美精品国产精品久久久 | 国产又黄又猛视频| 国产成人精品aa毛片| 国产精品久久久久久成人| 五月激情综合婷婷| 99久久久无码国产精品免费| 亚洲视频综合网| 91av久久| 豆国产97在线| 91精品高清| 国产aaaaa毛片| 久久久久久久久99精品| 国产一级特黄视频| 欧美一级艳片视频免费观看| 97电影在线看视频| 国产精品成人观看视频国产奇米| 综合中文字幕| 四虎4hu永久免费入口| 久久精品国产精品亚洲红杏| 中文字幕被公侵犯的漂亮人妻| 亚洲成av人片www| 性一交一乱一色一视频麻豆| 久久久久99精品久久久久| 丰满少妇一区| 日韩av在线电影观看| 免费视频一区| 三级男人添奶爽爽爽视频| 亚洲自拍欧美精品| 亚洲av无码乱码国产精品| 蜜臀久久99精品久久久久久宅男| 亚洲人成777| 亚洲一区二区三区乱码| 麻豆精品一区二区综合av| 夫妇交换中文字幕| 欧美在线999| 成人欧美一区| 国产精品免费在线免费 | 中文字幕日韩欧美精品在线观看| 在线毛片观看| 欧美主播一区二区三区美女 久久精品人 | 一区二区免费在线观看| 蜜桃一区二区三区四区| 国产美女高潮视频| 91精品国产一区二区人妖| 大地资源网3页在线观看| 91久久夜色精品国产网站| 亚洲国产精品日韩专区av有中文| 亚洲美女爱爱视频| 亚洲精品视频观看| 亚洲精品国偷拍自产在线观看蜜桃| 欧美猛交免费看| 精品国产乱子伦一区二区| 老太脱裤子让老头玩xxxxx| 成人99免费视频| 成人免费毛片视频| 最近2019年日本中文免费字幕| 欧美在线一级| 国产精品视频网站在线观看| 成人黄色大片在线观看| 国产精品视频久久久久久久| 精品中文视频在线| 国产精品高潮久久| 欧美一级黄色录像片| 丁香婷婷综合网| 亚洲另类在线观看| 日韩中文娱乐网| 国产精品xxx在线观看| 男人日女人bb视频| 欧美高清在线精品一区| 99热这里只有精品5| 久久欧美在线电影| 欧美精品色图| www.黄色网| 色哟哟国产精品免费观看| 黄网页免费在线观看| 国产伦理久久久| 免费精品视频在线| 国产精品第二十页| 中日韩午夜理伦电影免费| 亚洲天堂中文字幕在线观看| 看av免费毛片手机播放| 国产精品国产三级国产a| 亚洲AV无码国产精品午夜字幕 | 国产精品xxxxxx| 久久亚洲一区二区三区四区五区高| 国产福利资源一区| 国产91色在线观看| 午夜天堂影视香蕉久久| av在线电影观看| 国产一区高清视频| 久久99精品久久久久婷婷| 日韩精品在线不卡| 久久精品2019中文字幕| 欧洲精品一区| 一卡二卡三卡四卡五卡| 色系网站成人免费|