如何在SwiftUI中更改表单的背景颜色?

Sor*_*ica 4 ios swiftui

我想改变这种“浅灰色”背景表格的颜色,但.foregroundColor(Color.blue).background(Color.blue)不会似乎工作

struct ContentView : View {

 @State var value = ""

    var body: some View {
        Form {
            Section(header: Text("First Name")) {
                TextField($value)
            }
            Section(header: Text("Last Name")) {
                TextField($value)
            }
        }.foregroundColor(Color.blue)

    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

小智 18

对于所有版本

在看到这些解决方案后,我创建了一个修改器供您在 iOS 16 及更低版本中使用。

struct FormHiddenBackground: ViewModifier {
    func body(content: Content) -> some View {
        if #available(iOS 16.0, *) {
            content.scrollContentBackground(.hidden)
        } else {
            content.onAppear {
                UITableView.appearance().backgroundColor = .clear
            }
            .onDisappear {
                UITableView.appearance().backgroundColor = .systemGroupedBackground
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,您只需在表单后更新即可。

 Form {
     Text("Test text")
 }
 .frame(height: 400)
 .modifier(FormHiddenBackground())
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。这是唯一适用于 iOS16 和 Xcode 14.2 的解决方案 (2认同)

Vin*_*van 9

上面 Mojtaba Hosseini 接受的答案有效,但 init() 语句不是该UITableView语句的好地方。这是因为它“硬编码”了 ContentView 的 init 参数。在这种情况下,它没有所以一切正常,但是如果将一个@ObservedObject添加到视图中,那么这将破坏 init 函数。

只需将 UITable 语句添加到body,显式返回Form并删除init()

var body: some View {
    UITableView.appearance().backgroundColor = .clear
    return Form {...}
 }
Run Code Online (Sandbox Code Playgroud)

但是,在 上设置背景颜色Form通常会按预期工作。它在ContentView屏幕上不起作用的事实可能是一个错误。


小智 9

尝试这个

.onAppear {
   UITableView.appearance().backgroundColor = .blue
}
Run Code Online (Sandbox Code Playgroud)

  • `UITableView.appearance().backgroundColor = .blue` 普遍改变样式,这不是一个理想的解决方案。但是,我找不到替代解决方案。 (2认同)

Geo*_*e_E 7

不要改变全局appearance()

UITableView.appearance().backgroundColor = .red例如,您可以使用Form将 的背景颜色设置为红色。这可以出现在init视图中,但这会影响每个 ListForm

或者,您可以使用SwiftUI-Introspect通过执行以下操作来自定义单个:

struct ContentView: View {
    @State private var value = ""

    var body: some View {
        Form {
            Section(header: Text("First Name")) {
                TextField("First", text: $value)
            }

            Section(header: Text("Last Name")) {
                TextField("Last", text: $value)
            }
        }
        .introspectTableView { $0.backgroundColor = .systemBlue }
        .foregroundColor(Color.blue)
    }
}
Run Code Online (Sandbox Code Playgroud)

结果

您还可以将以下内容添加到每个部分以使这些部分也变为蓝色:

.listRowBackground(Color.blue)
Run Code Online (Sandbox Code Playgroud)


Moj*_*ini 5

可行的解决方案:

所有SwiftUI List都由UITableViewiOS中的a支持。因此,您需要更改tableView的背景颜色。但是由于ColorUIColor值略有不同,因此您可以摆脱UIColor

struct ContentView: View {

    init(){
        UITableView.appearance().backgroundColor = .clear
    }

    @State var value = ""

    var body: some View {
        Form {
            Section(header: Text("First Name")) {
                TextField("First Name", text: $value)
            }
            Section(header: Text("Last Name")) {
                TextField("Last Name", text: $value)
            }
        }
        .foregroundColor(Color.blue)
        .background(Color.yellow)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用所需的任何背景(包括所有Color

预习

请注意,顶部和底部的白色区域是安全的,您可以使用.edgesIgnoringSafeArea()修饰符来摆脱它们。

  • 这对于 iOS 14 来说不再正确。UITableView 不再支持列表。 (3认同)