列表 iOS 14 SwiftUI 中的额外间距

Posted

技术标签:

【中文标题】列表 iOS 14 SwiftUI 中的额外间距【英文标题】:Extra Spacing in List iOS 14 SwiftUI 【发布时间】:2020-09-16 15:48:35 【问题描述】:

我正在尝试从 ListView 中删除外部空间(标记为红色)。

此问题出现在 ios 14 和 Xcode 12 GM 中。

这是我正在使用的代码:

struct ContentView: View 
    
    var menuItems:[String] = ["Item 1", "Item 2", "Item 3"]
    
    var body: some View 
        List(self.menuItems, id:\.self)  title in
            MenuRow(title: title)
        
    


struct MenuRow:View 
    var title:String
    var body: some View 
        HStack(alignment: .center) 
            Text(title)
                    .foregroundColor(Color.black)
                    .font(Font.system(size: 14,
                            weight: .regular,
                            design: .default))
            Spacer()
            Text(title)
                    .foregroundColor(Color.black)
                    .font(Font.system(size: 14,
                            weight: .regular,
                            design: .default))
            
        
        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
        .listRowInsets(EdgeInsets())
        .background(Color.white)
    

【问题讨论】:

如果您想要自定义布局,我强烈建议您使用 LazyVStack + ScrollView(除了下面答案中的 ForEach)。默认的List 控件具有很难删除的内置样式。 但是你会失去许多 List 功能,而且大多数情况下你会失去单元格的可重用性。 【参考方案1】:

要使.listRowInsets 工作,您需要在List 中使用ForEach

List 
    ForEach(self.menuItems, id:\.self) 
        MenuRow(title: $0)
    

【讨论】:

您可以删除重复的listRowInsets,因为它已经存在于MenuRow【参考方案2】:

这对我有用。对于列表添加:

List 
    ...

.environment(\.defaultMinListRowHeight, 23)

【讨论】:

以上是关于列表 iOS 14 SwiftUI 中的额外间距的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI List with Divider 但在 MacOS 中没有额外的 Insets

恢复列表 SwiftUI 中的底部填充

为啥 SwiftUI UIHostingController 有额外的间距?

SwiftUI 列表的透明背景——iOS14 中的行为变化

SwiftUI禁用列表边框iOS 14 [重复]

SwiftUI禁用列表边框iOS 14 [重复]