SwiftUI ScrollView 捲動視圖教學

當你的內容超過螢幕範圍時,就需要使用 ScrollView 來讓使用者捲動查看。

基礎語法

ScrollView 的用法非常簡單,只需要將你的內容包在 ScrollView 裡即可。

ScrollView {
    VStack(spacing: 20) {
        ForEach(0..<20) { i in
            Text("項目 \(i)")
                .padding()
                .frame(maxWidth: .infinity)
                .background(.gray.opacity(0.2))
        }
    }
    .padding()
}
注意:ScrollView 內部通常會放一個 Stack (如 VStack),否則如果放多個 View,它們會被視為獨立的組件而不是一個整體。

捲動方向 (Axes)

你可以指定 ScrollView 的捲動方向。

  • .vertical: 垂直捲動 (預設值)。
  • .horizontal: 水平捲動。
  • []: 兩個方向都不捲動 (等於不可捲動)。

水平捲動範例

ScrollView(.horizontal, showsIndicators: false) { // 隱藏捲軸
    HStack {
        ForEach(0..<10) { i in
            Rectangle()
                .fill(.blue)
                .frame(width: 100, height: 100)
        }
    }
}
  • showsIndicators: false: 可以隱藏捲動條 (Scroll Bar)。

Safe Area 的影響

預設情況下,ScrollView 的內容在捲動時會穿過安全區域 (Safe Area) 的背後(例如 iPhone 的瀏海或底部 Home Indicator 區域)。這通常是我們想要的效果,讓內容看起來是滿版的。

如果你不希望這樣,可以使用 .clipped() 或調整安全區域設定,但大多數情況下預設行為是最佳的。

效能注意事項

ScrollView 會一次性載入其內部的所有 View。如果你有 1000 個項目,它就會一次建立 1000 個 Text,這會造成效能問題。

對於大量資料的列表,應該使用 LazyVStackList,它們只會建立即將出現在螢幕上的 View (Lazy Loading)。

ScrollView {
    LazyVStack { // 使用 LazyVStack 取代 VStack
        ForEach(0..<1000) { i in
            Text("項目 \(i)")
        }
    }
}

學會 ScrollView 後,我們可以進一步學習如何製作網格排版 (Grid Layout)