问题描述
struct ContentView: View {
var body: some View {
ScrollView {
ZStack {
ForEach(0..<50) { index in
Text("Test \(index)")
.offset(x: 0,y: CGFloat(index * 20))
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这会在 ZStack 内绘制 50 个 Text 视图,每个视图都有较大的 y 偏移量,以便将它们绘制到屏幕的可见部分之外:
整个内容都包含在 ScrollView 中,所以我希望我应该能够向下滚动到最后一个视图。
但是,它不会滚动超过测试 26。
如何通过分配偏移量并更新 ScrollView 的 contentSize 来安排 ZStack 内的视图?
解决方法
内容大小是由ScrollView内部的view的大小来计算的。所以我们唯一能做的就是改变视图大小。
默认情况下,VStack 大小是其中的视图的总大小(实际视图大小)。
在这种情况下,我们还可以使用 frame()
来更改大小。检查apple document
由于 VStack 将视图排列在中间,我们可以将其与 .top
对齐。
struct ContentView: View {
var body: some View {
ScrollView() {
VStack {
ForEach(0..<50) { index in
Text("Test \(index)")
.offset(x: 0,y: CGFloat(index * 20))
}
}
.frame( height: 2000,alignment: .top) //<=here
.border(Color.black)
}
}
}
,
如果我正确理解您的意图,那么您在这种情况下根本不需要偏移(SwiftUI 的工作方式不同)
ScrollView {
VStack {
ForEach(0..<50) { index in
Text("Test \(index)") // << use .padding if needed
}
}
}
注意:偏移不会改变视图布局,视图保持在创建它的同一个位置,但在偏移位置渲染;其他视图的帧也不受影响。请注意。