SwiftUI: 如何在VStack中去除视图之间的边距?

64
使用SwiftUI,我创建了一个VStack,其中包含一些固定元素和一个列表元素。原因是用户应该只滚动固定元素下面的区域。现在我看到第二个固定元素和列表之间有一个空白。我不知道这个空白从哪里来,并想要摆脱它,但我不知道如何做。该区域用红色标记出来。

使用SwiftUI,我创建了一个VStack,其中包含一些固定元素和一个列表元素。原因是用户应该只滚动固定元素下面的区域。现在我看到第二个固定元素和列表之间有一个空白。我不知道这个空白从哪里来,并想要摆脱它,但我不知道如何做。该区域用红色标记出来。

struct DashboardView : View, CoreDataInjected {

    var body: some View {
        GeometryReader { geometry in
            VStack {
                ScopeSelectorView().frame(maxWidth: .infinity).background(ColorPalette.gray)
                BalanceNumberView().frame(maxWidth: .infinity)
                List {
                    DashboardNavigationView(
                        height: geometry.size.height - ScopeSelectorView.height - BalanceNumberView.height
                    ).frame(maxWidth: .infinity).listRowInsets(.zero)
                }
            }
        }.background(Color.red).edgesIgnoringSafeArea(.all)
    }
}

查看截图

4个回答

137

由于您没有向VStack传递spacing参数,因此它会根据上下文选择默认间距。如果您不想有间距,请显式传递0。

VStack(spacing: 0) {
    // content here
}

1
VStack(spacing: -120) { // 这里放内容 }. 负数也可以使用。尝试将-120更改为最佳外观。 - araferna
2
即使我添加了“spacing: 0”,空格仍然存在。 - BollMose
2
@BollMose 也许你的子视图定义了上方或下方的空间? - ScottyBlades

10

我使用这个,

.padding(.top, -8)

更多细节请看这里。

VStack(spacing: 0) {
   List { ...
   }
   VStack{ ... }.padding(.top, -8)
}

1
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。适当的解释将极大地提高其长期价值,因为它展示了为什么这是一个好的问题解决方案,并使其对未来有类似问题的读者更加有用。请[编辑]您的答案以添加一些说明,包括您做出的假设。 - wscourge

8

分别

您可以在任何视图上使用 offset 修饰符,使每个内容看起来都不同:

VStack {
    Circle()
    Circle().offset(x: 0, y: -20)
    Circle().offset(x: 0, y: 40)
}

需要注意的是,它可以在两个方向上都是负数。


一次全部设置

VStackHStack 都有一个叫做 spacing 的参数,你可以将其设置为 0 或其他任何数字,以应用于所有元素。

VStack(spacing: 0) {
    Circle()
    Circle()
}

请注意,如有需要,它可能是负数。

0
你必须在垂直堆栈中传递一个间距参数 例如...
VStack(spacing: 0) {
    Text("list one")
        .padding()
    Text("list one")
        .padding()
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接