Итак, вопрос довольно простой, и он находится в заголовке. Я хочу удалить разделитель строк в SwiftUI iOS 14. Раньше я использовал UITableView().appearance().separatorStyle = .none
, который выполнял эту работу в iOS 13. Однако теперь это не работает. Любое обновление или идея о том, как заставить его работать. Спасибо:)
Как удалить строки разделителя списков в SwiftUI 2.0 в iOS 14
Ответы (11)
Вот демонстрация возможного решения. Протестировано с Xcode 12b.
List {
ForEach(0..<3) { _ in
VStack {
Text("Hello, World!").padding(.leading)
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.listRowInsets(EdgeInsets())
.background(Color.white)
}
}
Color(UIColor.systemBackground))
вместо Color.white
?
- person akmin; 27.06.2020
.listRowInsets(EdgeInsets(.init(top: -1, leading: -1, bottom: -1, trailing: -1)))
.
- person zrfrank; 16.08.2020
.listStyle(InsetListStyle())
- person pawello2222; 21.10.2020
Как я сделал список, который работает как на iOS 14, так и на iOS 13, в нем нет разделителей и дополнительных полей
struct NoButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
}
}
struct ListWithoutSepatorsAndMargins<Content: View>: View {
let content: () -> Content
var body: some View {
if #available(iOS 14.0, *) {
ScrollView {
LazyVStack(spacing: 0) {
self.content()
}
.buttonStyle(NoButtonStyle())
}
} else {
List {
self.content()
}
.listStyle(PlainListStyle())
.buttonStyle(NoButtonStyle())
}
}
}
Пример использования -
ListWithoutSepatorsAndMargins {
ForEach(0..<5) { _ in
Text("Content")
}
}
если в списке больше компонентов, оберните их в группу
ListWithoutSepatorsAndMargins {
Group {
self.groupSearchResults()
self.myGroups()
self.exploreGroups()
}
}
}
Надеюсь, это кому-то поможет, я потратил много времени на такие мелочи, Apple пытается сильно подтолкнуть нас к использованию LazyVStack, кажется
Объединили ответы @asperi, @akmin и @zrfrank в одно целое. По моему опыту, List
более надежен и эффективен, чем LazyVStack
, поэтому я все еще использую List
для всего сложного, требующего надежности.
extension View {
func listRow() -> some View {
self.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.listRowInsets(EdgeInsets(top: -1, leading: -1, bottom: -1, trailing: -1))
.background(Color(.systemBackground))
}
}
List {
Color.red
.listRow()
Color.green
.listRow()
}
LazyVStack
не подходит, если вы хотите иметь разделы списка.
- person Yiming Dong; 02.11.2020
Я нашел это простое решение на форумах разработчиков Apple. У меня работает 14.4:
List {
...
}.listStyle(SidebarListStyle())
Кажется, это добавляет немного отступов по краям. Если для вас это проблема, вы можете попробовать использовать отрицательный отступ.
На основе среднего показателя Джо answer У меня получился следующий модификатор:
struct ListSeparatorNone: ViewModifier {
var backgroundColor: Color = Color(.systemBackground)
func body(content: Content) -> some View {
content
.listRowInsets(EdgeInsets(top: -1, leading: 0, bottom: 0, trailing: 0))
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.background(backgroundColor)
}
}
Расширение просмотра:
extension View {
func listSeparatorNone(backgroundColor: Color = Color(.systemBackground)) -> some View {
self.modifier(ListSeparatorNone(backgroundColor: backgroundColor))
}
}
Пример использования:
List {
ForEach(viewModel.countries, id: \.self) { country in
Text(country)
.padding(.leading, 10)
}
.listSeparatorNone()
}
Если у вас не так много ячеек и, следовательно, вам не нужно полагаться на LazyVStack для повышения производительности, вы можете вернуться к ScrollView + VStack:
ScrollView {
VStack {
Row1()
Row2()
Row3()
}
}
Вы также можете вызвать эту функцию в конце вашего VStack (то есть внутри списка).
Это будет наложение на List Seperator в iOS 14 :)
private func hideDefaultListSeperator() -> some View {
Rectangle()
.fill(colorScheme == .light ? Color.white : Color.black)
.frame(maxHeight: 1)
}
Обновлять:
Я нашел решение, которое работает как на iOS 13, так и на iOS 14, дает простой список и использует List как на iOS.
struct ListWithoutSepatorsAndMargins<Content>: View where Content: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
List {
self.content()
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
.listRowInsets(EdgeInsets())
.background(Color.white)
}
.listStyle(PlainListStyle())
.buttonStyle(NoButtonStyle())
}
}
struct NoButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
}
и сделайте следующее в SceneDelegate.swift, чтобы удалить серый выбор ячеек по умолчанию
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
UITableView.appearance().separatorStyle = .none
UITableView.appearance().allowsSelection = false
.......
и мы можем использовать его следующим образом
ListWithoutSepatorsAndMargins {
ForEach(0..<5) { _ in
Text("Content")
}
}
ListWithoutSepatorsAndMargins {
Group {
self.groupSearchResults()
self.myGroups()
self.exploreGroups()
}
}
}
SceneDelegate
?
- person Ovi Trif; 24.03.2021
.environment(\.defaultMinListRowHeight, 1)
из предыдущего решения
- person Harish saini; 24.03.2021
Вот мое решение для iOS 14:
struct MyRowView: View {
var body: some View {
ZStack(alignment: .leading) {
// Background color of the Row. It will spread under the entire row.
Color(.systemBackground)
NavigationLink(destination: Text("Details")) {
EmptyView()
}
.opacity(0) // Hide the Disclosure Indicator
Text("Go to Details").padding(.leading)
}
// These 2 lines hide the row separators
.padding(.horizontal, -16) // Removes default horizontal padding
.padding(.vertical, -6) // Removes default vertical padding
}
}
В включающем списке должен быть этот модификатор
.listStyle (PlainListStyle ()).
Преимущество этого решения перед использованием LazyVStack заключается в том, что вы по-прежнему можете использовать возможности редактирования списка.
К сожалению, это решение полагается на жестко запрограммированные значения для удаления системных отступов по умолчанию для каждой строки. Надеюсь, SwiftUI 3.0 предоставит простые модификаторы .separatorStyle (.none) и .accessoryType (.none).
Код для удаления индикаторов раскрытия информации находится по адресу: https://www.appcoda.com/hide-disclosure-indicator-swiftui-list/.
iOS 15:
В этом году Apple представила новый модификатор .listRowSeparator
, который можно использовать для стилизации разделителей. вы можете передать .hidden
, чтобы скрыть это:
List(items, id:\.self) {
Text("Row \($0)")
.listRowSeparator(.hidden)
}
???? Также вы можете установить для каждого разделителя любой цвет с помощью настроек listRowSeparatorTintColor
, как я уже упоминал здесь, в этом ответе:
Приведенный выше ответ работает для меня, вы должны установить только ниже обе функции:
.listRowInsets(EdgeInsets())
.background(Color.white)
UITableView
под ним ... больше никаких хакеров)) - person Asperi   schedule 26.06.2020