从列表中删除顶部填充

Ben*_*ers 34 swiftui swiftui-list

我在 Stack Overflow 上看到过类似的问题,但没有一个能够回答我的问题。

我已经创建了一个List,但我想删除 中内容上方的填充空间(用红色箭头标记)List。使用时如何删除它GroupedListStyle

截屏

这是通过以下方式显示的ainainaList中的ainaina :VStackNavigationViewfullscreenCover

var body: some View {
  NavigationView {
    VStack {
      taskEventPicker
      myList
    }
    .navigationBarTitle("Add Task", displayMode: .inline)
  }
}
Run Code Online (Sandbox Code Playgroud)

其中taskEventPicker是分段Picker(绿色框内):

var taskEventPicker: some View {
  Picker("Mode", selection: $selection) { /* ... */ }
  .pickerStyle(SegmentedPickerStyle())
  .padding()
}
Run Code Online (Sandbox Code Playgroud)

myList有问题的表格(黄色框内):

var myList: some View {
  List { /* ... */ }
  .listStyle(GroupedListStyle())
}
Run Code Online (Sandbox Code Playgroud)

我尝试过的

注意:我正在寻找可以适用于GroupedListStyle. 据我所知,这个问题不会发生在PlainListStyle. 默认情况下也会出现此填充问题listStyle

Xcode 版本:12.5

rba*_*win 33

首先,我想说这GroupedListStyle正在按预期进行。

在 iOS 上,分组列表样式显示比普通样式更大的页眉和页脚,这在视觉上拉开了不同部分的成员的距离。

你说你已经尝试过这个,但它确实对我有用(Xcode 12.5.1):

    List { ... }    
    .onAppear(perform: {
        UITableView.appearance().contentInset.top = -35
    })
Run Code Online (Sandbox Code Playgroud)

ZStack您还可以通过将列表与堆栈底部和Picker顶部的列表一起使用来隐藏列表标题。选择器确实具有透明度,因此您还必须添加一个不透明视图来充当Picker.

var body: some View {
    NavigationView {
        ZStack(alignment: .top) {
            List { ... }
            .listStyle(.grouped)
            .padding(.top, 30)
            
            Color.white
                .frame(height: 65)
            
            Picker { ... }
            .pickerStyle(.segmented)
            .padding()
        }
        .navigationBarTitle("Add Task", displayMode: .inline)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

据我所知,这看起来与实际执行的操作相同PlainListStyle,但我假设您有特定的原因想要使用GroupedListStyle.

  • 对于任何与OP不同的人来说,他们不需要`.listStyle(GroupedListStyle())`并且在代码中没有指定样式,添加显式的`.listStyle(PlainListStyle())`可能是一个有效的解决方案删除列表顶部不需要的空间。(这不是“在评论中回答”,因为这种方法不能解决OP的问题,这需要保留GroupedListStyle。) (7认同)

Sli*_*ron 5

为列表中的第一部分提供标题:Section(header: Spacer(minLength: 0))

免责声明:这并不能完全消除顶部间距,但它确实会产生与本机设置应用程序相同的结果。

注意:这对我在 iOS 14.5 上有效

VStack {
    List {
        Section(header: Spacer(minLength: 0)) {
            Text(verbatim: "First Section")
        }

        Section {
            Text(verbatim: "Second Section")
        }
    }
    .listStyle(GroupedListStyle())
}
Run Code Online (Sandbox Code Playgroud)

没有节标题 带节标题 本机设置应用程序


Cod*_*ezy 5

我有一个类似的设置,我在 VStack 中有一些视图和一个列表,并且我的列表顶部出现了一个不需要的空间。就我而言,我需要将 VStack 间距设置为 0,这解决了问题,因为它实际上只是与 VStack 的间距。

VStack(spacing: 0) { ... }
Run Code Online (Sandbox Code Playgroud)


Nie*_*els 5

接受的答案的部分contentInsent工作得很好,除非例如在我的例子中,在导航堆栈的末尾,您想在包含设置为 的某个详细视图中List使用navigationBarTitleDisplayMode.inline。当在堆栈中导航回使用另一个设置为 的List视图时,内容和交错非常严重。他们也可能会做任何设定的事情。navigationBarTitleDisplayMode.largeListNavigationBarnavigationBarTitleDisplayMode

在我的情况下切换到listStyle(.plain)不是一个可行的选择,因为在详细视图中,我失去了与 List's 之间的精美动画内置过渡EditMode,这些过渡似乎只存在于分组listStyle品种中。

最后,经过几天的挫折,我发现这tableHeaderView是最适合我的问题的方法 - 当然,它对于解决原始问题也同样有效。一切都在这里......:

XCode 文档

...在这句话中:

“将视图分配给此属性时[即tableHeaderView],将该视图的高度设置为非零值”

所以我喜欢:

List {
  // bla bla bla
}
.listStyle(.grouped)
.onAppear {
  let tableHeaderView = UIView(frame: .zero)
  tableHeaderView.frame.size.height = 1
  UITableView.appearance().tableHeaderView = tableHeaderView
}
Run Code Online (Sandbox Code Playgroud)

就这么简单。希望它也能帮助你!