SwiftUI:滚动视图中的中心内容
我试图在SwiftUI中的SwiftUI:滚动视图中的中心内容,swiftui,Swiftui,我试图在SwiftUI中的VStack滚动视图中集中一组视图。为了简化事情,我只是想让它使用一个文本视图。以下是我到目前为止的想法: var body: some View { ScrollView(alwaysBounceVertical: true){ HStack(alignment: .center) { Spacer() Text("This Is a Test") Spacer() } //HStack
VStack
滚动视图中集中一组视图。为了简化事情,我只是想让它使用一个文本
视图。以下是我到目前为止的想法:
var body: some View {
ScrollView(alwaysBounceVertical: true){
HStack(alignment: .center) {
Spacer()
Text("This Is a Test")
Spacer()
} //HStack
.background(Color.green)
} //ScrollView
.background(Color.gray)
}
这导致:
我希望文本在中间是这样的:
因此,
HStack
应为全宽,文本应居中。看起来这应该很容易,但我不明白我做错了什么 使用GeometryReader,可以获得有关包含视图大小的信息,并使用该信息调整视图大小
var body: some View {
GeometryReader { geometry in <--- Added
ScrollView(alwaysBounceVertical: true){
HStack(alignment: .center) {
Spacer()
Text("This Is a Test")
Spacer()
} //HStack
.frame(width: geometry.size.width) <--- Added
.background(Color.green)
} //ScrollView
.background(Color.gray)
}
}
var主体:一些视图{
几何导引头{geometry in这似乎是Xcode 11.0 beta版中的一个bug,ScrollView
内容无法填充滚动视图。如果将ScrollView
替换为List
,它将按预期工作。但如果必须使用滚动视图,一个解决方法是修复滚动视图的内容宽度
因此,您的代码将如下所示:
ScrollView(alwaysBounceVertical: true) {
HStack(alignment: .center) {
Spacer()
Text("This Is a Test")
Spacer()
} // HStack
.frame(width: UIScreen.main.bounds.width) // set a fixed width
.background(Color.green)
} // ScrollView
.background(Color.gray)
结果:
您应该使用修饰符frame
并设置其最大宽度:
。
所以它告诉它的父母:“越宽越好”:
var主体:一些视图{
滚动视图(.vertical,showsIndicators:true){
HStack(对齐:。中心){
垫片()
文本(“这是一个测试”)
.frame(最大宽度:。无穷大)//请使用GeometryReader
而不是UIScreen
bounds@MatteoPacini这是为什么?是因为旋转设备时它不工作吗?这个解决方案可行,但现在我正在讨论设置.frame
和使用GeometryReady
。谢谢!这听起来是一个很好的解释。但是应该这样吗可能无法限制scrollview的一个滚动方向来解决此类问题?我使用的是Xcode beta 5,您的代码与我配合得很好。您使用的是哪种Xcode?因为在beta 5中,scrollview没有alwaysBounceVertical修饰符。scrollview没有alwaysBounceVertical的构造函数方法。@ErkamKUCET已修复
var body: some View {
ScrollView(.vertical, showsIndicators: true){
HStack(alignment: .center) {
Spacer()
Text("This Is a Test")
.frame(maxWidth: .infinity) // <- this
Spacer()
} //HStack
.background(Color.green)
} //ScrollView
.background(Color.gray)
}