当我们使用SwiftUI List组件并且需要一个分区标题时,每个分区的标题上方会出现顶部填充。
在iOS15下,我们使用
但是在iOS16中,这个设置似乎不起作用。请查看附件iOS16&Xcode14 build截图,在滚动时:iOS16&Xcode14 build scroll。
因此,我的问题是如何在iOS16中去除分区标题的顶部填充,并且当滚动List时,它的分区标题将被固定,就像附件iOS15&Xcode14 build scroll所示。
自从iOS16以来,SwiftUI List组件似乎使用UICollectionView而不是UITableView,因此我尝试通过全局设置UICollectionView的分区顶部填充来解决这个问题。不幸的是,我没有找到设置UICollectionView分区顶部填充的方法。
我的代码如下。
非常感谢。
在iOS15下,我们使用
UITableView.appearance().sectionHeaderTopPadding = 0
来解决这个问题。请查看附件iOS15&Xcode14 build截图。但是在iOS16中,这个设置似乎不起作用。请查看附件iOS16&Xcode14 build截图,在滚动时:iOS16&Xcode14 build scroll。
因此,我的问题是如何在iOS16中去除分区标题的顶部填充,并且当滚动List时,它的分区标题将被固定,就像附件iOS15&Xcode14 build scroll所示。
自从iOS16以来,SwiftUI List组件似乎使用UICollectionView而不是UITableView,因此我尝试通过全局设置UICollectionView的分区顶部填充来解决这个问题。不幸的是,我没有找到设置UICollectionView分区顶部填充的方法。
我的代码如下。
//
// ContentView.swift
// ListIniOS16
//
// Created by Eric on 2022/07/23.
//
import SwiftUI
struct ContentView: View {
@State private var collections: [ListData] = ListData.collection
init() {
let appBarTheme = UINavigationBarAppearance()
appBarTheme.configureWithOpaqueBackground()
appBarTheme.backgroundColor = UIColor(.gray)
UINavigationBar.appearance().standardAppearance = appBarTheme
UINavigationBar.appearance().scrollEdgeAppearance = appBarTheme
if #available(iOS 15.0, *) {
// can fix sectionHeaderTopPadding issue in iOS15,
// but in iOS16 it doesn't work.
UITableView.appearance().sectionHeaderTopPadding = 0
}
}
var body: some View {
NavigationView {
VStack {
List {
ForEach(collections) { item in
Section(header: SectionHeader(title: item.group)) {
ForEach(item.rows) { row in
Text(row.name)
}
}
.listRowBackground(Color.gray.opacity(0.3))
}
}
.listStyle(.plain)
}
.navigationTitle("ListSectionHeader")
.navigationBarTitleDisplayMode(.inline)
}
}
struct SectionHeader: View {
let title: String
var body: some View {
ZStack(alignment: .leading) {
Color(.lightGray)
.frame(maxWidth: .infinity)
Text(title)
.font(.system(size: 16, weight: .bold))
.foregroundColor(.primary)
.padding(EdgeInsets(top: 10, leading: 18, bottom: 10, trailing: 18))
}
.listRowInsets(EdgeInsets())
}
}
}
struct ListData: Codable, Identifiable {
var id = UUID()
let group: String
let rows: [Row]
}
extension ListData {
static let collection: [ListData] = [.a, .b, .c]
static let a = ListData(group: "A", rows: [.row1, .row2, .row3])
static let b = ListData(group: "B", rows: [.row1, .row2, .row3, .row1, .row2, .row3])
static let c = ListData(group: "C", rows: [.row1, .row2, .row3, .row1, .row2, .row3, .row1, .row2, .row3])
}
struct Row: Codable, Equatable, Identifiable {
var id = UUID()
let name: String
}
extension Row {
static let row1 = Row(name: "Row1")
static let row2 = Row(name: "Row2")
static let row3 = Row(name: "Row3")
}
非常感谢。
许多感谢。