SwiftUI - 滚动视图内的垂直居中内容

nun*_*123 17 authentication scrollview ios swiftui

我正在尝试在我的应用程序上编写一个简单的登录页面。我开始在我新更新的 Mac OS Catalina 上使用 SwiftUI。Apple 文档仍然缺乏很多。我需要在占据整个页面的 Scrollview 上垂直居中一个 VStack,其宽度为 400 的“限制”。

像这样的东西:

ScrollView(.vertical) {
    VStack {
        Text("Hello World")
    }
    .frame(maxWidth: 400, alignment: .center)
}
Run Code Online (Sandbox Code Playgroud)

使用 UIScrollView 很容易,只需要设置 ContentView 以填充高度和宽度,然后在内容视图中居中垂直 StackLayout 但现在使用 SwiftUI 我只是想知道..

目标是这样的(感谢作者)

在此处输入图片说明

如果有人想知道为什么我想要滚动视图中的所有内容,那是因为我的表单非常大,我希望用户同时使用横向和纵向视图,所以我真的需要内容可以滚动,还要记住,在 Ipad 中表单不会填满整个屏幕,这就是我希望它垂直居中的原因。

Ahm*_*san 31

我已经根据@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)
      }
    }
  }
}

Run Code Online (Sandbox Code Playgroud)

您可以像这样在应用程序中的任何位置使用它

  var body: some View {
    VScrollView {
      VStack {
        Text("YOUR TEXT HERE")
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)


Ale*_*son 25

您可以通过使用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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

预览