如何从 Mac OS 中的 SwiftUI 列表中删除 bottom/top 项目填充
How to remove bottom/top item padding from SwiftUI List in Mac OS
我很难使用 SwiftUI 从 MacOS 中的单元格中删除所有填充。我好像连苹果的代码都做不到!
https://developer.apple.com/tutorials/swiftui/creating-a-macos-app
例如,在Xcode中的MacLandmarks
文件夹的LandMarkList
里面,我在forEach
的末尾放了一个.listRowInsets(EdgeInsets())
所以代码如下所示:
struct LandmarkList: View {
@EnvironmentObject private var userData: UserData
@Binding var selectedLandmark: Landmark?
@Binding var filter: FilterType
var body: some View {
List(selection: $selectedLandmark) {
ForEach(userData.landmarks) { landmark in
if (!self.userData.showFavoritesOnly || landmark.isFavorite)
&& (self.filter == .all
|| self.filter.category == landmark.category
|| (self.filter.category == .featured && landmark.isFeatured)) {
LandmarkRow(landmark: landmark).tag(landmark)
.background(Color.red)
}
}
.listRowInsets(EdgeInsets())
}
}
}
我还在每个单元格中设置了红色背景色。这是我得到的结果:
关键是我似乎无法摆脱此列表单元格之间的垂直 space。我见过的所有解决方案似乎都为此提到了 iOS,但我想在 Mac OS 中执行此操作(应该具有相同的行为,但事实并非如此)。
这是一个可能的解决方案演示(使用 Xcode 11.4 / macOS 10.15.6 测试)。
注意:如果需要有多个活动列表(即 NSTableView)并且其中一些应该有单元间距(也称为分隔符),那么它们应该由 SwiftUI 工具来完成,因为这方法禁用所有可见列表的单元间距
var body: some View {
VStack {
Text("Selected: \(selectedPerson ?? "<none>")")
List(selection: $selectedPerson) {
ForEach(persons, id: \.self) { person in
Text(person)
}
.listRowBackground(Color.red)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
}.border(Color.green)
.onReceive(NotificationCenter.default.publisher(for: NSView.frameDidChangeNotification)) {
guard let tableView = [=10=].object as? NSTableView else { return }
tableView.intercellSpacing = .zero
}
}
}
我很难使用 SwiftUI 从 MacOS 中的单元格中删除所有填充。我好像连苹果的代码都做不到!
https://developer.apple.com/tutorials/swiftui/creating-a-macos-app
例如,在Xcode中的MacLandmarks
文件夹的LandMarkList
里面,我在forEach
的末尾放了一个.listRowInsets(EdgeInsets())
所以代码如下所示:
struct LandmarkList: View {
@EnvironmentObject private var userData: UserData
@Binding var selectedLandmark: Landmark?
@Binding var filter: FilterType
var body: some View {
List(selection: $selectedLandmark) {
ForEach(userData.landmarks) { landmark in
if (!self.userData.showFavoritesOnly || landmark.isFavorite)
&& (self.filter == .all
|| self.filter.category == landmark.category
|| (self.filter.category == .featured && landmark.isFeatured)) {
LandmarkRow(landmark: landmark).tag(landmark)
.background(Color.red)
}
}
.listRowInsets(EdgeInsets())
}
}
}
我还在每个单元格中设置了红色背景色。这是我得到的结果:
关键是我似乎无法摆脱此列表单元格之间的垂直 space。我见过的所有解决方案似乎都为此提到了 iOS,但我想在 Mac OS 中执行此操作(应该具有相同的行为,但事实并非如此)。
这是一个可能的解决方案演示(使用 Xcode 11.4 / macOS 10.15.6 测试)。
注意:如果需要有多个活动列表(即 NSTableView)并且其中一些应该有单元间距(也称为分隔符),那么它们应该由 SwiftUI 工具来完成,因为这方法禁用所有可见列表的单元间距
var body: some View {
VStack {
Text("Selected: \(selectedPerson ?? "<none>")")
List(selection: $selectedPerson) {
ForEach(persons, id: \.self) { person in
Text(person)
}
.listRowBackground(Color.red)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
}.border(Color.green)
.onReceive(NotificationCenter.default.publisher(for: NSView.frameDidChangeNotification)) {
guard let tableView = [=10=].object as? NSTableView else { return }
tableView.intercellSpacing = .zero
}
}
}