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
控制滚动位置
#
如果需要手动控制滚动到特定位置,可以使用 ScrollViewReader
和 scrollTo
方法(支持 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
。