39
votes

Comment supprimer les séparateurs / diviseurs de "ligne" d'une liste dans SwiftUI?

J'essaie de supprimer les séparateurs de "ligne" (appelés diviseurs dans SwiftUI) d'une List dans SwiftUI.

J'ai parcouru la documentation de List , mais je n'ai pas pu trouver de modificateur pour cela.

Toute aide serait appréciée.


2 commentaires

Reformulation simple pour rendre l'article plus compréhensible


Le montage de Kuya a du sens. J'ai le même problème qui est la façon dont mon moteur de recherche me conduit ici. L'auteur d'origine souhaite supprimer les lignes de division qui sont fournies par défaut avec la vue List .


7 Réponses :


9
votes

Vous pouvez utiliser ForEach dans un ScrollView au lieu de List pour des vues dynamiques sans aucun style


1 commentaires

Cela ne fonctionne pas si ScrollView est à l'intérieur d'un VStack



5
votes

iOS 13 construit uniquement:

Ajout de UITableView.appearance().separatorColor = .clear pour l'initialiseur

struct SomeView: View {
  init() {
        UITableView.appearance().separatorColor = .clear
    }
}

J'espère que vous résolvez ce problème.


0 commentaires

4
votes

iOS 13 construit uniquement:

La solution de contournement actuelle consiste à les supprimer via UIAppearance :

UITableView.appearance(whenContainedInInstancesOf: 
    [UIHostingController<ContentView>.self]
).separatorStyle = .none


0 commentaires

15
votes

iOS 14

Apple a présenté LazyVStack dans iOS 14. vous pouvez envisager de l'utiliser à la place de la liste pour cela:

init() {
    // 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")
    }
}

Gardez à l'esprit que LazyVStack est paresseux et ne rend pas toutes les lignes tout le temps. Ils sont donc très performants et suggérés par Apple lui-même dans la WWDC 2020.


iOS 13

Il y a un UITableView derrière la List de SwiftUI pour iOS. Donc pour supprimer

Séparateurs supplémentaires (sous la liste):

vous avez besoin d'une tableFooterView et pour supprimer

Tous les séparateurs (y compris les réels):

vous avez besoin de separatorStyle pour être .none

ScrollView {
    LazyVStack {
        ForEach((1...100), id: \.self) {
           Text("Placeholder \($0)")
        }
    }
}

2 commentaires

J'ai essayé votre suggestion pour iOS 14 avec Xcode 12.0 beta 2 (ScrollView / LazyVStack), mais elle montre toujours les séparateurs de cellules. En outre, List a toujours les mêmes séparateurs.


Le remplacement de la liste par Scrollview avec VStack perturbe le NavigationView avec un grand titre



12
votes

iOS 13 construit uniquement

alors que cette solution fonctionne correctement, ViewModifier le travail à l'aide de ViewModifier

List {
    Text("1")
    Text("2")
    Text("3")
}.listSeparatorStyleNone()

faisons maintenant une petite extension qui aiderait à cacher les détails

extension View {
    public func listSeparatorStyleNone() -> some View {
        modifier(ListSeparatorStyleNoneModifier())
    }
}

Comme vous pouvez le voir, nous avons enveloppé notre code de réglage d'apparence dans un petit modificateur de vue soigné. vous pouvez le déclarer directement maintenant

public struct ListSeparatorStyleNoneModifier: ViewModifier {
    public func body(content: Content) -> some View {
        content.onAppear {
            UITableView.appearance().separatorStyle = .none
        }.onDisappear {
            UITableView.appearance().separatorStyle = .singleLine
        }
    }
}


2 commentaires

Excellente réponse, je vais courir avec ça!


Cette solution ne fonctionne pas lorsque vous avez une 2ème liste présentée sous forme de feuille et que vous ne voulez pas masquer le séparateur dans cette 2ème liste.



2
votes

iOS 13 construit uniquement:

Voir les réponses existantes en utilisant UITableView.appearance() .

Soyez conscient que dans le SDK iOS 14, List ne semble pas être soutenu par UITableView . Voir la solution alternative ci-dessous:

iOS 14 Xcode 12 Beta 1 uniquement:

J'ai une solution SwiftUI pure pour iOS 14, mais qui sait combien de temps cela va continuer à fonctionner. Il repose sur le fait que votre contenu ait la même taille (ou plus) que la ligne de liste par défaut et un arrière-plan opaque.

- Cela ne fonctionne pas pour les versions iOS 13.

Testé dans Xcode 12 beta 1:

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)
  }
}

Ou si vous recherchez un ViewModifier réutilisable:

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)

4 commentaires

C'est la bonne réponse pour iOS 14. Pour iOS 13 construit des réponses avec UITableView.appearance (). SeparatorStyle = .none fonctionne correctement.


Il ne s'agit pas de supprimer le séparateur. Il ajoute simplement un .background(Color.white) sur une vue au-dessus du séparateur et bloque la vue. essayez .background(Color.red.opacity(0.2)) pour vous voir.


@MojtabaHosseini si vous regardez le code que j'ai posté, vous verrez que j'affirme exactement la même chose! Merci beaucoup d'avoir été si précis sur la définition de la removing !


cette solution affiche toujours le séparateur en haut de la première ligne de la liste



1
votes

De: Swiftui Views Mastery Book SwiftUI 2.0 Mark Moeykens

.listStyle(SidebarListStyle()) # IOS 14

Vous pouvez appliquer ce nouveau style de liste qui supprimera les lignes de séparation.


0 commentaires