有没有办法在 SwiftUI 中使列表样式 insetGrouped?
Is there a way to make List style insetGrouped in SwiftUI?
举个例子,我有一个这样声明的列表
List {
Section {
Text(“Test Row Title 1”)
}
Section {
Text(“Test Row Title 2”)
}
}
能不能做成和UITableView.Style.insetGrouped一样的样式?我找不到任何相关信息。
我认为它会像 .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()
}
}
为了 "fake" 一个 insetGrouped List,我将 List 转换为 ScrollView,将 Sections 转换为 VStacks,就像这样。
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))
}
}
正如我所说,它并不理想,但在 Apple(或其他人)创建 InsetGroupedListStyle 之前它会起作用。当发生这种情况时,将 ScrollView 改回 List 并将 VStacks 改回 Sections 应该是一个简单的例子。
祝你好运...
您可以将 .environment(\.horizontalSizeClass, .regular)
添加到您的列表中。
在iOS 13.2中,您可以在.listStyle(GroupedListStyle())
上设置.environment(\.horizontalSizeClass, .regular)
以获得与UITableView.Style.insetGrouped
相同的样式。
List {
Section {
Text(“Test Row Title 1”)
}
Section {
Text(“Test Row Title 2”)
}
}.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)
显然 iOS/iPadOS 14 中有一个新的 API 最终允许在 SwiftUI 中使用 InsetGrouped 样式。
List {
...
}
.listStyle(InsetGroupedListStyle())
举个例子,我有一个这样声明的列表
List {
Section {
Text(“Test Row Title 1”)
}
Section {
Text(“Test Row Title 2”)
}
}
能不能做成和UITableView.Style.insetGrouped一样的样式?我找不到任何相关信息。
我认为它会像 .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()
}
}
为了 "fake" 一个 insetGrouped List,我将 List 转换为 ScrollView,将 Sections 转换为 VStacks,就像这样。
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))
}
}
正如我所说,它并不理想,但在 Apple(或其他人)创建 InsetGroupedListStyle 之前它会起作用。当发生这种情况时,将 ScrollView 改回 List 并将 VStacks 改回 Sections 应该是一个简单的例子。
祝你好运...
您可以将 .environment(\.horizontalSizeClass, .regular)
添加到您的列表中。
在iOS 13.2中,您可以在.listStyle(GroupedListStyle())
上设置.environment(\.horizontalSizeClass, .regular)
以获得与UITableView.Style.insetGrouped
相同的样式。
List {
Section {
Text(“Test Row Title 1”)
}
Section {
Text(“Test Row Title 2”)
}
}.listStyle(GroupedListStyle())
.environment(\.horizontalSizeClass, .regular)
显然 iOS/iPadOS 14 中有一个新的 API 最终允许在 SwiftUI 中使用 InsetGrouped 样式。
List {
...
}
.listStyle(InsetGroupedListStyle())