Ios 有没有办法在SwiftUI中对列表样式进行分组?

Ios 有没有办法在SwiftUI中对列表样式进行分组?,ios,swiftui,swiftui-list,Ios,Swiftui,Swiftui List,比如说,我有一个这样声明的列表 List { Section { Text(“Test Row Title 1”) } Section { Text(“Test Row Title 2”) } } 是否可以使其样式与UITableView.style.InsetGroup相同?我找不到关于那件事的任何信息。 我以为它会像.listStyle(InsetGroupedStyle())一样简单,下面的代码可能会帮助您,并为您提供一个自

比如说,我有一个这样声明的列表

List {
    Section {
        Text(“Test Row Title 1”)
    }
    Section {
        Text(“Test Row Title 2”)
    }
}
是否可以使其样式与UITableView.style.InsetGroup相同?我找不到关于那件事的任何信息。
我以为它会像
.listStyle(InsetGroupedStyle())
一样简单,下面的代码可能会帮助您,并为您提供一个自定义视图的解决方案。玩
.cornerRadius
.padding
修改器:

struct ContentView: View {

var body: some View {

    VStack {

        List {

            Section {
                Text("Test Row Title 1")
            }
            Section {
                Text("Test Row Title 2")
            }
        }.cornerRadius(20)
        .padding()


        List {

            Section {
                Text("Test Row Title 3")
            }
            Section {
                Text("Test Row Title 4")
            }
        }.cornerRadius(20)
            .padding()


    }.background(Color.blue)
  }
}

我的实现并不理想,但这是我现在满意的。我首先创建了一个ViewModifier,CardViewModifier(),用于创建插入卡片视图。我在我的应用程序中的几个地方使用它,而不仅仅是列表

struct CardViewModifier: ViewModifier {

var backgroundColor = Color(.systemBackground)

func body(content: Content) -> some View {
    content
        .padding()
        .frame(maxWidth: .infinity)
        .background(Color(.systemBackground))
        .cornerRadius(12)
        .padding()
    }
}
为了“伪造”insetgroup列表,我将列表转换为滚动视图,并将部分转换为vstack,如下所示

struct ContentView: View {

    let data = ["Row 1", "Row 2", "Row 3", "Row 4", "Row 5"]

    var body: some View {

        ScrollView {

            VStack {
                ForEach(data, id:\.self) { row in
                    VStack {
                        Text("Section 1, \(row)")
                        Divider()
                    }
                }
            }
            .modifier(CardViewModifier())

            VStack {
                ForEach(data, id:\.self) { row in
                    Text("Section 2, \(row)").padding()
                }
            }
            .modifier(CardViewModifier())
        }
        .background(Color(.secondarySystemBackground))
    }
}
正如我所说,这并不理想,但在苹果(或其他人)创建InsetGroupedListStyle之前,它将一直有效。发生这种情况时,只需将ScrollView更改回列表,并将VSTACK更改回节


祝您好运…

您可以将
.environment(\.horizontalSizeClass.regular)
添加到您的列表中。

在iOS 13.2中,您可以在
.listStyle(GroupedListStyle())
上设置
.environment(\.horizontalSizeClass.regular)
,以获得与
UITableView.style.InsetGroup相同的样式

List {
    Section {
        Text(“Test Row Title 1”)
    }
    Section {
        Text(“Test Row Title 2”)
    }
}.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)

显然,iOS/iPadOS 14中有一个新的API,它最终允许在SwiftUI中使用InsetGroup样式

List {
  ...
}
.listStyle(InsetGroupedListStyle())

这是一个不错的解决方案,但它的工作原理与UITableView上的InsetGroup相同。我不确定插入分组视图的角半径是多少。哦,而且我猜没有办法删除列表中的分隔符,对吗?我知道我可以做
UITableView.appearance().separatorColor=.clear
,但那看起来很难看,一点也不像本地的。是的,你是对的,似乎你必须创建自己的自定义视图。是的,分隔符就是解决方案。我这里唯一的缺点是,当你使用NavigationView时,你导航回使用此技巧的视图,部分圆角丢失/变方(你必须以某种方式强制重画以恢复圆角)。