使滚动视图中的视图在带有标签的顶部 vstack 之间以可用 space 为中心(它可以更改)
Make view in scroll view centered in available space between top vstack with labels (it can change)
我有滚动视图,其中顶部可以是不同数量的文本,从零到很多。在中心我有另一个视图,它应该在 AVAILABLE SPACE 中垂直居中,所以如果我们在顶部没有文本 - 我的视图应该在屏幕中央,如果有一些文本 - 它应该在可用的 space.If 中输入 我已经没有可用的 space,我的视图的填充应该在顶部 24 并且 bottom.I 尝试在带有文本的堆栈和我的之间使用 spacers视图,以及视图和滚动视图之间,但行为不像 expected.Also 我尝试在带有文本的堆栈下添加水平堆栈(居中对齐),但它不会拉伸。还尝试设置 minHeight,但它只是为我的“居中”视图设置了具体大小。
一种方法是使用最小高度为滚动视图高度的“外部”VStack
。
随着顶部的“行数”,蓝色 VStack
增加,“外部”堆栈下部的 Text 对象将减少,直到无法再压缩。
到那时,“外部”堆栈将变得比滚动视图高,您就可以滚动了。
这是一个简单的例子:
import SwiftUI
struct ScrollTestView: View {
@State var numRows: Int = 0
var body: some View {
GeometryReader { geometry in
ScrollView {
// "outer" VStack
// minimum Height is the scroll view height
VStack(alignment: .center, spacing: 0) {
if numRows > 0 {
// "blue" VStack with variable number of "rows"
// remove a row on each tap
VStack(alignment: .center, spacing: 20) {
Text("Each tap in blue frame removes a row.")
ForEach((1...numRows), id: \.self) {
Text("Hello \([=10=])")
}
}
.frame(maxWidth: .infinity)
.background(Color.blue)
.onTapGesture {
if numRows > 0 {
numRows -= 1
}
}
}
Text("Hello World\nEach tap in gray frame adds a row above.")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.multilineTextAlignment(.center)
.background(Color.gray)
.padding(24)
.onTapGesture {
numRows += 1
}
}
.frame(minHeight: geometry.size.height)
}
}
}
}
struct ScrollTestView_Previews: PreviewProvider {
static var previews: some View {
ScrollTestView()
}
}
我有滚动视图,其中顶部可以是不同数量的文本,从零到很多。在中心我有另一个视图,它应该在 AVAILABLE SPACE 中垂直居中,所以如果我们在顶部没有文本 - 我的视图应该在屏幕中央,如果有一些文本 - 它应该在可用的 space.If 中输入 我已经没有可用的 space,我的视图的填充应该在顶部 24 并且 bottom.I 尝试在带有文本的堆栈和我的之间使用 spacers视图,以及视图和滚动视图之间,但行为不像 expected.Also 我尝试在带有文本的堆栈下添加水平堆栈(居中对齐),但它不会拉伸。还尝试设置 minHeight,但它只是为我的“居中”视图设置了具体大小。
一种方法是使用最小高度为滚动视图高度的“外部”VStack
。
随着顶部的“行数”,蓝色 VStack
增加,“外部”堆栈下部的 Text 对象将减少,直到无法再压缩。
到那时,“外部”堆栈将变得比滚动视图高,您就可以滚动了。
这是一个简单的例子:
import SwiftUI
struct ScrollTestView: View {
@State var numRows: Int = 0
var body: some View {
GeometryReader { geometry in
ScrollView {
// "outer" VStack
// minimum Height is the scroll view height
VStack(alignment: .center, spacing: 0) {
if numRows > 0 {
// "blue" VStack with variable number of "rows"
// remove a row on each tap
VStack(alignment: .center, spacing: 20) {
Text("Each tap in blue frame removes a row.")
ForEach((1...numRows), id: \.self) {
Text("Hello \([=10=])")
}
}
.frame(maxWidth: .infinity)
.background(Color.blue)
.onTapGesture {
if numRows > 0 {
numRows -= 1
}
}
}
Text("Hello World\nEach tap in gray frame adds a row above.")
.frame(maxWidth: .infinity, maxHeight: .infinity)
.multilineTextAlignment(.center)
.background(Color.gray)
.padding(24)
.onTapGesture {
numRows += 1
}
}
.frame(minHeight: geometry.size.height)
}
}
}
}
struct ScrollTestView_Previews: PreviewProvider {
static var previews: some View {
ScrollTestView()
}
}