SwiftUI - Scrollview 中的垂直居中内容
SwiftUI - Vertical Centering Content inside Scrollview
我正在尝试在我的应用程序上编写一个简单的登录页面。我开始在我最新更新的 Mac OS Catalina 上使用 SwiftUI。 Apple文档仍然缺乏很多。
我需要将 VStack 垂直居中在滚动视图上,占据整个页面,宽度为 400 "limit"。
像这样:
ScrollView(.vertical) {
VStack {
Text("Hello World")
}
.frame(maxWidth: 400, alignment: .center)
}
使用 UIScrollView 很容易,只需要将 ContentView 设置为填充高度和宽度,然后将 Vertical StackLayout 居中放置在 Content View 中,但现在使用 SwiftUI 我只是想知道..
目标是这样的(感谢作者)
如果有人想知道为什么我想要滚动视图中的所有内容,那是因为我的表单很大,我希望用户同时使用横向和纵向视图,所以我真的需要内容可以滚动,还请记住在 Ipad 中,表单不会填满整个屏幕,这就是我希望它垂直居中的原因。
通过使用 GeometryReader
获取父视图的尺寸并将滚动视图内容的 minHeight
设置为父视图的高度,您可以在滚动视图中垂直居中内容。
当内容太大无法垂直放置时,它将像正常情况一样滚动。
例如:
var body: some View {
GeometryReader { geometry in // Get the geometry
ScrollView(.vertical) {
VStack {
Text("Form goes here")
.frame(maxWidth: 400) // Set your max width
}
.padding()
.background(Color.yellow)
.frame(width: geometry.size.width) // Make the scroll view full-width
.frame(minHeight: geometry.size.height) // Set the content’s min height to the parent
}
}
}
我根据@Alex 的回答构建了一个更通用的视图
/// Custom vertical scroll view with centered content vertically
///
struct VScrollView<Content>: View where Content: View {
@ViewBuilder let content: Content
var body: some View {
GeometryReader { geometry in
ScrollView(.vertical) {
content
.frame(width: geometry.size.width)
.frame(minHeight: geometry.size.height)
}
}
}
}
您可以像这样在应用中的任何地方使用它
var body: some View {
VScrollView {
VStack {
Text("YOUR TEXT HERE")
}
}
}
我正在尝试在我的应用程序上编写一个简单的登录页面。我开始在我最新更新的 Mac OS Catalina 上使用 SwiftUI。 Apple文档仍然缺乏很多。 我需要将 VStack 垂直居中在滚动视图上,占据整个页面,宽度为 400 "limit"。
像这样:
ScrollView(.vertical) {
VStack {
Text("Hello World")
}
.frame(maxWidth: 400, alignment: .center)
}
使用 UIScrollView 很容易,只需要将 ContentView 设置为填充高度和宽度,然后将 Vertical StackLayout 居中放置在 Content View 中,但现在使用 SwiftUI 我只是想知道..
目标是这样的(感谢作者)
如果有人想知道为什么我想要滚动视图中的所有内容,那是因为我的表单很大,我希望用户同时使用横向和纵向视图,所以我真的需要内容可以滚动,还请记住在 Ipad 中,表单不会填满整个屏幕,这就是我希望它垂直居中的原因。
通过使用 GeometryReader
获取父视图的尺寸并将滚动视图内容的 minHeight
设置为父视图的高度,您可以在滚动视图中垂直居中内容。
当内容太大无法垂直放置时,它将像正常情况一样滚动。
例如:
var body: some View {
GeometryReader { geometry in // Get the geometry
ScrollView(.vertical) {
VStack {
Text("Form goes here")
.frame(maxWidth: 400) // Set your max width
}
.padding()
.background(Color.yellow)
.frame(width: geometry.size.width) // Make the scroll view full-width
.frame(minHeight: geometry.size.height) // Set the content’s min height to the parent
}
}
}
我根据@Alex 的回答构建了一个更通用的视图
/// Custom vertical scroll view with centered content vertically
///
struct VScrollView<Content>: View where Content: View {
@ViewBuilder let content: Content
var body: some View {
GeometryReader { geometry in
ScrollView(.vertical) {
content
.frame(width: geometry.size.width)
.frame(minHeight: geometry.size.height)
}
}
}
}
您可以像这样在应用中的任何地方使用它
var body: some View {
VScrollView {
VStack {
Text("YOUR TEXT HERE")
}
}
}