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.
7 Réponses :
Vous pouvez utiliser ForEach
dans un ScrollView
au lieu de List
pour des vues dynamiques sans aucun style
Cela ne fonctionne pas si ScrollView
est à l'intérieur d'un VStack
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.
La solution de contournement actuelle consiste à les supprimer via UIAppearance
:
UITableView.appearance(whenContainedInInstancesOf: [UIHostingController<ContentView>.self] ).separatorStyle = .none
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.
Il y a un UITableView
derrière la List
de SwiftUI pour iOS. Donc pour supprimer
vous avez besoin d'une tableFooterView
et pour supprimer
vous avez besoin de separatorStyle
pour être .none
ScrollView { LazyVStack { ForEach((1...100), id: \.self) { Text("Placeholder \($0)") } } }
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
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 } } }
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.
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:
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)
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
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.
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
.