How to remove “row” separators/dividers from a List in SwiftUI?

前端 未结 7 2411
渐次进展
渐次进展 2020-12-05 04:35

I\'m trying to remove the "row" separators (known as dividers in SwiftUI) from a List in SwiftUI.

I went through the List document

7条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-05 04:50

    iOS 13 builds only:

    See existing answers using UITableView.appearance().

    ⚠️ Be aware that in the iOS 14 SDK, List does not appear to be backed by UITableView. See the alternate solution below:

    iOS 14 Xcode 12 Beta 1 only:

    I do have a pure SwiftUI solution for iOS 14, but who knows how long it's going to continue working for. It relies on your content being the same size (or larger) than the default list row and having an opaque background.

    ⚠️ This does not work for iOS 13 builds.

    Tested in Xcode 12 beta 1:

    yourRowContent
      .padding(EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16))
      .frame(
        minWidth: 0, maxWidth: .infinity,
        minHeight: 44,
        alignment: .leading
      )
      .listRowInsets(EdgeInsets())
      .background(Color.white)
    

    Or if you're looking for a reusable ViewModifier:

    import SwiftUI
    
    struct HideRowSeparatorModifier: ViewModifier {
    
      static let defaultListRowHeight: CGFloat = 44
    
      var insets: EdgeInsets
      var background: Color
    
      init(insets: EdgeInsets, background: Color) {
        self.insets = insets
    
        var alpha: CGFloat = 0
        UIColor(background).getWhite(nil, alpha: &alpha)
        assert(alpha == 1, "Setting background to a non-opaque color will result in separators remaining visible.")
        self.background = background
      }
    
      func body(content: Content) -> some View {
        content
          .padding(insets)
          .frame(
            minWidth: 0, maxWidth: .infinity,
            minHeight: Self.defaultListRowHeight,
            alignment: .leading
          )
          .listRowInsets(EdgeInsets())
          .background(background)
      }
    }
    
    extension EdgeInsets {
    
      static let defaultListRowInsets = Self(top: 0, leading: 16, bottom: 0, trailing: 16)
    }
    
    extension View {
    
      func hideRowSeparator(
        insets: EdgeInsets = .defaultListRowInsets,
        background: Color = .white
      ) -> some View {
        modifier(HideRowSeparatorModifier(
          insets: insets,
          background: background
        ))
      }
    }
    
    struct HideRowSeparator_Previews: PreviewProvider {
    
      static var previews: some View {
        List {
          ForEach(0..<10) { _ in
            Text("Text")
              .hideRowSeparator()
          }
        }
        .previewLayout(.sizeThatFits)
      }
    }
    

提交回复
热议问题