【问题标题】:How to remove/adjust separators in List?如何删除/调整列表中的分隔符?
【发布时间】:2019-10-23 05:30:50
【问题描述】:

有没有办法在 SwiftUI 的 List 视图中删除分隔符或调整分隔符插入?

在UIKit中可以通过

tableView.separatorStyle = .none

tableview.separatorInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18)

对应的 SwiftUI 替代品有哪些?

【问题讨论】:

    标签: list swiftui


    【解决方案1】:

    对于后者,您可以使用listRowInsets:

    List { 
      Text("Item 1")
      Text("Item 2")
      Text("Item 3")
    }
    .listRowInsets(EdgeInsets(top: 0, left: 18, bottom: 0, right: 18))
    
    

    【讨论】:

    • 如何调整分隔符插入?这似乎只调整了行中实际视图的插图,还是我遗漏了什么?
    【解决方案2】:

    适用于 ios 13 不适用于 ios 14

    您可以使用以下方法删除分隔符:UITableView.appearance().separatorStyle = .none in SwiftUI

    添加就行了

    List() {
    }.onAppear {
             UITableView.appearance().separatorColor = .clear
    }
    

    struct SomeListView : View {
        init( ) {          
            UITableView.appearance().separatorStyle = .none
               }
    
        var body : some View {
            Text("TEST")
            }
    
    struct CallList : View {
        var body : some View {
    
        List() {
        SomeListView()
        }
            }
    }
    

    【讨论】:

    • 我们说的是 SwiftUI 中的 List,而不是 UIKit 中的 UITableView
    • 我可以确认这是可行的。 @Frédéric Adda On iOS SwiftUI List 在后台使用 UITableView。所以在 iOS 上这是一个完全有效的解决方案
    • 好的,知道的好技巧,谢谢!直到有一个真正的 SwiftUI 修改器来改变它,我想这是最好的解决方案。
    • 只是想提一下它不再适用于 iOS 14 和 Xcode 12 beta 4
    • 对于 iOS 14,您可以使用 ScrollView { LazyVStack(spacing: 0) { } } 而不是 List(),会改变外观但会删除分隔符
    【解决方案3】:

    SwiftUI 中:

    删除分隔符

     init() {
    
        UITableView.appearance().separatorStyle = .none //remove separators
    
     }
    
     var body: some View {
    
        List {
    
            Text("Index 1")
            Text("Index 2")
            Text("Index 3")
            Text("Index 4")
        }
    
     }
    

    【讨论】:

      【解决方案4】:

      这一切都可以在 SwiftUI 中完成

      与 UIKit tableView.separatorStyle = .none 中的旧方法相比,要删除分隔符,请在 init 或表格视图的 onAppear 方法中添加此行:

      init() {
          UITableView.appearance().separatorStyle = .none
      }
      

      要与 UIKit tableview.separatorInset = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18) 中的行比较调整分隔符插入,请在 init 或 onAppear 方法中添加此行:

      List(...){
          ...
      }.onAppear() {
          UITableView.appearance().separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 50)
      }
      

      【讨论】:

      • 后面的代码似乎不适用于 iOS 14.1 (Xcode 12.1)
      • 外观 API 会影响应用中的所有表格视图。
      • "这一切都可以在 SwiftUI 中完成" 然后你立即使用 UIKit ?
      【解决方案5】:

      iOS 15.0+

      Mac Catalyst 15.0+

      listRowSeparator(_:edges:)

      设置与此特定行关联的分隔符的显示模式。 https://developer.apple.com/

      List {
          ForEach(0..<10, id: \.self) { number in
              Text("Text\(number)")
          }.listRowSeparator(.hidden)
      }
      
      

      iOS 2.0+

      struct ListRowSeperatorModifier: ViewModifier {
          func body(content: Content) -> some View {
              if #available(iOS 15.0, *) {
                  content.listRowSeparator(.hidden)
              } else {
                  content.onAppear {
                      UITableView.appearance().separatorStyle = .none
                  }
                  .onDisappear {
                      UITableView.appearance().separatorStyle = .singleLine
                  }
              }
          }
      }
      
      
      extension View {
          func hideListRowSeparator() -> some View  {
              return  self.modifier(ListRowSeperatorModifier())
          }
      }
      
      

      ForEach 上使用.hideListRowSeparator()

      List {
          ForEach(0..<10, id: \.self) { number in
             Text("Text\(number)")
          }.hideListRowSeparator()
      }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 2017-04-27
        • 1970-01-01
        相关资源
        最近更新 更多