【问题标题】:Remove extra line separators below List in SwiftUI在 SwiftUI 中删除列表下方的多余行分隔符
【发布时间】:2019-10-23 04:20:37
【问题描述】:

我创建了一个简单的List,如下所示,但它下面有额外的分隔符。

List {
  Text("Item 1")
  Text("Item 2")
  Text("Item 3")
}

结果:

我尝试将 List 嵌入到 VStack 中并添加 Spacer() 如下代码,但它无法正常工作。它会删除大约一半的空单元格。

VStack{
  List {
    Text("Item 1")
    Text("Item 2")
    Text("Item 3")
  }
  Spacer()
}

如何在 SwiftUI 中删除这些额外的分隔符?

【问题讨论】:

  • 在 UIKit 中,您可以通过将表视图的 footerView 设置为空视图来解决此问题。也许 SwiftUI 支持 List 页脚。

标签: ios swiftui


【解决方案1】:

这不是一个完美的解决方案,但您可以使用 ScrollView,其中每个单元格都是使用 ForEach 调用创建的,而分隔符是使用 Divider() 创建的。

编辑:我在 WWDC 上与 Apple 工程师讨论过这个问题。他们听到了很多关于移除/更改分隔符的反馈。但是,目前我的上述答案是他们的建议。

【讨论】:

  • 任何提示如何为重新加载添加一些漂亮的动画?数据什么时候会改变?
  • @Lifeplus 说得好。现在,我将使用使用列表的其他答案之一,并且应该很快添加操作分隔符的能力。
  • 不错的解决方案,但我们不需要忘记“可重用”视图(用于表格视图/列表)。如果我们使用滚动视图作为解决方案,我们会自动增加内存使用量。
  • 如果我们需要“编辑”功能,这也不是一个选项。喜欢删除/移动行的能力。
  • @RustamG 你是对的。坦率地说,到目前为止,我对 SwiftUI 提供的标准元素的最低限度的定制有点失望。我知道它是新的,但如果它是 Apple 平台的未来,你会认为他们会有巨大的推动力。
【解决方案2】:

不是一个理想的解决方案,但您可以通过.listStyle(.grouped) 制作列表样式.grouped,这会删除下面可能出现的任何空单元格。

【讨论】:

    【解决方案3】:

    这是一种方法。

    List {
             Section(footer: Text(""))) {
                    Text("One")
                    Text("Two")
                    Text("Three")
                }
         }
    

    您可以创建自己的,而不是页脚中的文本视图。 注意 - 我试过 EmptyView() 但实际上并没有删除多余的分隔符。

    【讨论】:

    • 谢谢,有没有什么办法可以去掉添加到列表顶部和底部的额外分隔符?
    • 正如我所提到的,您可以创建自己的并使用它来代替文本,也许是 1 pt 高度的视图。
    【解决方案4】:

    两种方法:

    struct ContentView: View {
        
        var body: some View {
            
            List {
                    Text("One")
                    Text("Two")
                    Text("Three")
            }.listStyle(GroupedListStyle())
        }
    }
    
    struct ContentView: View {
        
        var body: some View {
            
            List {
                Section(header: Text("Header"), footer: Text("Footer")) {
                    Text("One")
                    Text("Two")
                    Text("Three")
                }
            }
        }
    }
    

    我推荐分组列表样式。

    【讨论】:

      【解决方案5】:

      添加一个白色矩形作为页脚和 0 EdgeInsets 对我有用:

      struct Footer: View {
          var body: some View {
              Rectangle()
                  .foregroundColor(.white)
                  .listRowInsets(EdgeInsets())
          }
      }
      
      struct Timeline : View {
          var body: some View {
              List {
                  Section(footer: Footer()) {
                      Text("Item 1")
                      Text("Item 2")
                      Text("Item 3")
                  }
              }
          }
      }
      

      唯一的问题是它还添加了一个 Header,我不知道如何摆脱它。

      【讨论】:

        【解决方案6】:

        试试这个,如果你想使用这个部分,还有一个可见的页脚:

        List {
            Section(footer: Text("")) {
                Text("My text")
            }
            EmptyView()
        }
        

        如果你没有任何部分,我想出了一个隐藏页脚的黑客方法:

        List {
            Text("Item 1")
            Text("Item 2")
        
            // Adding empty section with footer
            Section(footer:
                Rectangle()
                    .foregroundColor(.clear)
                    .background(Color(.systemBackground))){EmptyView()}
                    .padding(.horizontal, -15)
        }
        

        【讨论】:

          【解决方案7】:

          仅限 iOS 13 版本:

          你可以添加这个,删除分隔符。

          UITableView.appearance().separatorColor = .clear
          

          【讨论】:

            【解决方案8】:

            iOS 14:

            iOS 14 默认情况下列表下方不显示额外的分隔符,要删除所有分隔符,您需要在ScrollView 中使用LazyVStack . (因为 iOS 不再支持 SwiftUI 列表的外观)。


            iOS 13:

            ⚠️ 此方法已弃用,并且不适用于 iOS 14

            不需要Section.grouped 样式!

            在 iOS 13 的 SwiftUI 的 List 后面有一个 UITableView。所以要删除

            - 额外的分隔符(在列表下方):

            您需要 tableFooterView 并删除。 请注意默认情况下,iOS 14 不会在列表下方显示额外的分隔符。

            - 所有分隔符(包括实际分隔符):

            你需要separatorStyle 成为.none

            init() {
                if #available(iOS 14.0, *) { 
                    // iOS 14 doesn't have extra separators below the list by default.
                } else {
                    // To remove only extra separators below the list:
                    UITableView.appearance().tableFooterView = UIView()
                }
            
                // To remove all separators including the actual ones:
                UITableView.appearance().separatorStyle = .none
            }
            
            var body: some View {
                List {
                    Text("Item 1")
                    Text("Item 2")
                    Text("Item 3")
                }
            }
            

            注意它消除了所有表格/列表的分隔符。因此,您可以根据需要在 onAppear() 等方法中切换它。

            【讨论】:

            • 此时“tableFooterView”和“separatorStyle”都无法访问。
            • 对于 IOS 14,当我们使用 LazyVStack 时,我们失去了列表的选择和重新排序功能。因此,它并不是适用于所有情况的有效解决方案。
            • "默认情况下,OS 14 不会在列表下方显示额外的分隔符。"这是否意味着有一种方法可以在列表下方显示分隔符?因为我有完全相反的情况,我想显示空行。
            【解决方案9】:

            这仅适用于 iOS 13 版本。

            使用onAppear通过UITableView修改一个分隔符样式,用onDisappear恢复到初始状态

            List {}
            .onAppear { UITableView.appearance().separatorStyle = .none }
            .onDisappear { UITableView.appearance().separatorStyle = .singleLine }
            

            【讨论】:

              【解决方案10】:

              由于未知原因,即使在 iOS14 之后,我在tableView 中也遇到了这个问题,尽管上面的答案是默认情况下将不再有额外的分隔线。

              我用来解决它的方法是将footerView 设置为空的UIView,就像在同一个答案中一样。

              your_tableView.tableFooterView = UIView()
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2020-10-17
                • 1970-01-01
                • 2019-10-26
                • 2010-11-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多