SwiftUI — ScrollTarget

https://developer.apple.com/documentation/swiftui/scrolltarget


1. 滚动目标对齐(Scroll Target Behavior) #

在 iOS 17 及更高版本中,SwiftUI 引入了新的修饰符来控制滚动视图的定位行为,使内容能够自动对齐到特定位置(如分页或对齐到子视图边界)。

核心修饰符: #

  • scrollTargetLayout()
    标记子视图为滚动目标的布局容器,通常与 scrollTargetBehavior 结合使用。

  • scrollTargetBehavior(_:)
    定义滚动行为,例如分页(paging)或对齐到子视图(viewAligned)。

示例 1:分页滚动 #

ScrollView(.horizontal) {
    LazyHStack {
        ForEach(0..<10) { index in
            Color.blue
                .frame(width: 300, height: 200)
                .cornerRadius(12)
        }
    }
    .scrollTargetLayout() // 标记子视图为滚动目标
}
.scrollTargetBehavior(.paging) // 启用分页行为

示例 2:对齐到子视图边界 #

ScrollView(.horizontal) {
    LazyHStack {
        ForEach(0..<10) { index in
            Text("Item \(index)")
                .frame(width: 100, height: 50)
                .background(.yellow)
        }
    }
    .scrollTargetLayout()
}
.scrollTargetBehavior(.viewAligned) // 滚动停止时对齐子视图

2. 通过 ScrollViewReader 控制滚动位置 #

如果需要手动控制滚动到特定位置,可以使用 ScrollViewReaderscrollTo 方法(支持 iOS 14+)。

示例:滚动到指定 ID #

struct ContentView: View {
    let items = (0..<100).map { $0 }
    @State private var scrollID: Int?

    var body: some View {
        ScrollView {
            ScrollViewReader { proxy in
                LazyVStack {
                    ForEach(items, id: \.self) { item in
                        Text("Item \(item)")
                            .id(item)
                    }
                }
                .onChange(of: scrollID) { newValue in
                    if let id = newValue {
                        proxy.scrollTo(id, anchor: .top)
                    }
                }
            }
        }
        Button("Jump to 50") {
            scrollID = 50
        }
    }
}

关键概念总结 #

方法/修饰符作用支持版本
scrollTargetLayout标记子视图为滚动目标布局容器iOS 17+
scrollTargetBehavior控制滚动停止时的对齐行为(分页/子视图对齐)iOS 17+
ScrollViewReader通过编程方式滚动到指定 ID 的视图iOS 14+

适用场景 #

  • 分页效果:横向图片轮播、教程页。
  • 精准定位:跳转到列表的特定项(如聊天列表底部)。
  • 对齐控制:确保滚动停止时内容对齐到屏幕中心或边缘。

如果需要兼容旧版本系统,优先使用 ScrollViewReader;若面向 iOS 17+,可直接使用更简洁的 scrollTargetBehavior

本文共 600 字,创建于 Feb 18, 2025
相关标签: Xcode, SwiftUI