———
【追記 2022/9/14】
iOS16では、当記事の方法ではスペースを変更できなくなりました。
新たな対応策はこちらの記事をご参照ください。
———
iOS15になって、急にPlainListStyleのListのSection上部にスペースが生じるようになりました。
struct ContentView: View {
var body: some View {
List {
Section(header: Text("Section (iOS \(UIDevice.current.systemVersion))")) {
ForEach(1...5) { row in
Text("Row: \(row)")
}
}
}
.listStyle(.plain)
}
}
↑上記ソースをiOS15と14.5で実行した結果の比較ですが、iOS15ではSectionの上が妙に離れています。
iOS15でSection(UITableViewのHeader)のデフォルトのデザインが変更されてこうなったようですが、それに伴いUITableViewに sectionHeaderTopPadding というプロパティが追加されています。
(参考 : https://developer.apple.com/documentation/uikit/uitableview/3750914-sectionheadertoppadding)
調べたところSwiftUIからではこれを変更することはできなさそう(?)でしたので、UITableView.appearance() を使います。
// Write this somewhere
if #available(iOS 15, *) {
UITableView.appearance().sectionHeaderTopPadding = 0
}
結果は以下のとおりです↓
Appleの中でSwiftUIを本気で使わせる気がないのではないかと疑いたくなる、相変わらずの痒いところの手の届かなさ。
何はともあれ、ひとまずこれで対処していきます。
(もしSwiftUIから修正できる方法をご存知の方がいましたら、Twitterやお問い合わせからこっそりお教えいただけると助かります)
ちなみに、AppStoreでリリース済みのアプリ(Xcode 12.5でビルド)は大丈夫だったので、Xcode 13からこの対応が必要になるようです。