成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用 SwiftUI 中 ScrollView 的滾動偏移

移動開發 iOS
在本文中,我們深入探討了 SwiftUI 框架中 ScrollView 的新特性,特別是如何通過 ScrollPosition 類型實現更精確的滾動控制。我們介紹了如何使用 ScrollPosition 類型進行滾動位置的設置和讀取,包括使用偏移量、視圖標識符等方式進行操作。

前言

WWDC 24 已經結束,我決定開始寫一些關于 SwiftUI 框架即將推出的新特性的文章。今年,蘋果繼續填補空白,引入了對滾動位置更細粒度的控制。本周,我們將學習如何操作和讀取滾動偏移。

使用 scrollPosition

SwiftUI 框架已經允許我們通過視圖標識符跟蹤和設置滾動視圖的位置。這種方法效果不錯,但不足以更準確地跟蹤用戶交互。

struct ContentView: View {
    @State private var position: Int?
    
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(0..<100) { index in
                    Text(verbatim: index.formatted())
                        .id(index)
                }
            }
            .scrollTargetLayout()
        }
        .scrollPosition(id: $position)
    }
}

在上面的代碼示例中,我們使用了視圖標識符和 scrollPosition 修飾符來跟蹤和設置滾動視圖的位置。雖然這種方法效果不錯,但在某些情況下,尤其是需要更精確的用戶交互跟蹤時,它可能不夠用。為了彌補這一不足,SwiftUI 引入了新的 ScrollPosition 類型,使我們能夠通過偏移量、滾動視圖的邊緣、視圖標識符等組合滾動位置。

新的 ScrollPosition 類型

SwiftUI 框架引入了新的 ScrollPosition 類型,使我們能夠通過偏移量、滾動視圖的邊緣、視圖標識符等組合滾動位置。

struct ContentView: View {
    @State private var position = ScrollPosition(edge: .top)
    
    var body: some View {
        ScrollView {
            Button("Scroll to bottom") {
                position.scrollTo(edge: .bottom)
            }
            
            ForEach(1..<100) { index in
                Text(verbatim: index.formatted())
                    .id(index)
            }
            
            Button("Scroll to top") {
                position.scrollTo(edge: .top)
            }
        }
        .scrollPosition($position)
    }
}

如上例所示,我們定義了 position 狀態屬性,并使用 scrollPosition 視圖修飾符將滾動視圖與狀態屬性綁定。我們還放置了兩個按鈕,允許你快速滾動到滾動視圖中的第一個或最后一個項目。ScrollPosition 類型提供了許多重載的 scrollTo 函數,使我們能夠處理不同的情況。

為滾動添加動畫

通過附加動畫視圖修飾符并傳遞 ScrollPosition 類型的實例作為 value 參數,我們可以輕松地為編程滾動添加動畫。

struct ContentView: View {
    @State private var position = ScrollPosition(edge: .top)
    
    var body: some View {
        ScrollView {
            Button("Scroll to bottom") {
                position.scrollTo(edge: .bottom)
            }
            
            ForEach(1..<100) { index in
                Text(verbatim: index.formatted())
                    .id(index)
            }
            
            Button("Scroll to top") {
                position.scrollTo(edge: .top)
            }
        }
        .scrollPosition($position)
        .animation(.default, value: position)
    }
}

滾動到特定項目

我們添加了另一個按鈕來將滾動視圖的位置更改為隨機項目。我們仍然使用 ScrollPosition 類型的 scrollTo 函數,但我們提供了一個可哈希的標識符。這個選項允許我們將位置更改為特定項目,通過使用 anchor 參數,我們可以選擇所選視圖的哪個點應該可見。

struct ContentView: View {
    @State private var position = ScrollPosition(edge: .top)
    
    var body: some View {
        ScrollView {
            Button("Scroll somewhere") {
                let id = (1..<100).randomElement() ?? 0
                position.scrollTo(id: id, anchor: .center)
            }
            
            ForEach(1..<100) { index in
                Text(verbatim: index.formatted())
                    .id(index)
            }
        }
        .scrollPosition($position)
        .animation(.default, value: position)
    }
}

滾動到特定偏移

最后但同樣重要的是 scrollTo 函數的 point 參數重載,允許我們傳遞 CGPoint 實例以將視圖滾動到內容的特定點。

struct ContentView: View {
    @State private var position = ScrollPosition(edge: .top)
    
    var body: some View {
        ScrollView {
            Button("Scroll to offset") {
                position.scrollTo(point: CGPoint(x: 0, y: 100))
            }
            
            ForEach(1..<100) { index in
                Text(verbatim: index.formatted())
                    .id(index)
            }
        }
        .scrollPosition($position)
        .animation(.default, value: position)
    }
}

如上例所示,我們使用帶有 CGPoint 參數的 scrollTo 函數。它還提供重載,允許我們僅按 X 或 Y 軸滾動視圖。

struct ContentView: View {
    @State private var position = ScrollPosition(edge: .top)
    
    var body: some View {
        ScrollView {            
            Button("Scroll to offset") {
                position.scrollTo(y: 100)
                position.scrollTo(x: 200)
            }
            
            ForEach(1..<100) { index in
                Text(verbatim: index.formatted())
                    .id(index)
            }
        }
        .scrollPosition($position)
        .animation(.default, value: position)
    }
}

讀取滾動位置

我們學習了如何使用新的 ScrollPosition 類型操作滾動位置,這也允許我們讀取滾動視圖的位置。ScrollPosition 提供了可選的 edge、point 和 viewID 屬性,以在你編程滾動時讀取值。

每當用戶與滾動視圖交互時,這些屬性將變為 nil。ScrollPosition 類型上的 isPositionedByUser 屬性允許我們了解何時用戶手勢移動滾動視圖內容。

提供一個可以運行示例:

下面是一個可以運行的示例代碼,演示如何讀取和顯示滾動視圖的位置。我們將使用一個 Text 視圖來顯示當前滾動位置:

import SwiftUI

struct ContentView: View {
    @State private var position = ScrollPosition(edge: .top)
    @State private var scrollOffset: CGPoint?

    var body: some View {
        VStack {
            ScrollView {
                LazyVStack {
                    ForEach(0..<100) { index in
                        Text("Item \(index)")
                            .id(index)
                            .padding()
                            .background(Color.yellow)
                            .cornerRadius(10)
                            .padding(.horizontal)
                    }
                }
                .scrollPosition($position)
                .onScrollGeometryChange { geometry in
                    scrollOffset = geometry?.contentBounds.origin
                }
            }
            .animation(.default, value: position)
            
            if let offset = scrollOffset {
                Text("Scroll Offset: x = \(Int(offset.x)), y = \(Int(offset.y))")
                    .padding()
            } else {
                Text("Scroll Offset: not available")
                    .padding()
            }
        }
        .padding()
    }
}

在這個示例中,我們使用了 onScrollGeometryChange 修飾符來讀取滾動視圖的幾何變化。每當滾動視圖滾動時,geometry?.contentBounds.origin 將提供當前滾動位置的偏移量。我們將這個偏移量存儲在 scrollOffset 狀態屬性中,并在視圖底部顯示當前的滾動位置。

總結

在本文中,我們深入探討了 SwiftUI 框架中 ScrollView 的新特性,特別是如何通過 ScrollPosition 類型實現更精確的滾動控制。我們介紹了如何使用 ScrollPosition 類型進行滾動位置的設置和讀取,包括使用偏移量、視圖標識符等方式進行操作。此外,我們還展示了如何通過動畫和事件處理來增強用戶體驗。通過這些新功能,開發者可以更靈活地控制滾動視圖的行為,從而創建更加流暢和直觀的用戶界面。希望這些內容對你有所幫助。

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

2024-05-17 09:00:45

SwiftUIvisionOS

2022-08-24 09:02:27

SwiftUIiOS

2022-06-02 10:02:47

Kubectl更新應用Linux

2022-11-11 09:01:08

SwiftUI條形圖子視圖

2021-12-22 15:13:03

iOS 15Swift二進制

2024-08-09 09:02:56

2022-06-06 09:01:16

SwiftUI自定義導航

2023-08-21 14:02:59

iOS 17SwiftUI

2021-07-29 18:48:32

Swift iOS macOS

2017-05-03 16:30:38

AndroidScrollView滾動視圖

2024-03-21 07:08:53

AIntervalCronPython

2021-08-16 12:13:02

SwiftUIList ArticleList

2017-01-04 10:18:00

React NativScrollViewAndroid

2023-12-29 09:01:10

SwiftUI空狀態Product?

2023-11-20 09:55:34

音頻圖表SwiftUI

2021-07-13 12:20:40

Core DataSwiftUIiOS

2023-12-29 09:01:27

SwiftUI視圖修飾符

2022-11-14 16:38:15

前端Web開發

2013-04-25 14:26:54

GridView

2020-02-21 08:00:00

Pythonasyncio編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线观看一区 | 性一交一乱一透一a级 | 国产精品久久欧美久久一区 | 黄色在线免费观看 | 久久久青草婷婷精品综合日韩 | 欧美一级二级视频 | 一区二区在线看 | 91精品国产91久久综合桃花 | 亚洲综合无码一区二区 | 免费福利视频一区二区三区 | 欧美精品成人一区二区三区四区 | 一级做受毛片免费大片 | 国产日韩欧美一区二区 | 99在线免费观看视频 | 成人免费网视频 | 超碰伊人久久 | 日韩欧美精品在线 | 国产精品中文字幕一区二区三区 | 国产精品久久毛片av大全日韩 | 亚洲成色777777在线观看影院 | 欧美成人免费电影 | 久久综合狠狠综合久久综合88 | 一区二区三区不卡视频 | 欧美一级二级三级视频 | 亚洲自拍一区在线观看 | 综合激情久久 | 亚洲一二三区精品 | 在线视频 亚洲 | 天天操夜夜操免费视频 | 欧美操操操| 二区中文 | 国产一区二区三区在线视频 | 美国黄色毛片 | 中文字幕亚洲区一区二 | 一级毛片大全免费播放 | 国产亚韩 | 亚洲1区| 国产不卡在线播放 | 日韩欧美一级 | 亚洲国产一区二区三区在线观看 | 亚洲一区|