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

时间:2019-07-29 13:02:33

标签: 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)

    }
}

enter image description here

5 个答案:

答案 0 :(得分:5)

可行的解决方案:

在iOS中,所有SwiftUI的List都由UITableView支持。因此您需要更改 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)
    }
}

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

Preview

请注意,这些顶部和底部白色区域是安全区域,您可以使用.edgesIgnoringSafeArea()修饰符删除它们。

答案 1 :(得分:0)

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

将UITable语句添加到body,显式返回Form并删除init()更加简单。

var body: some View {
    UITableView.appearance().backgroundColor = .clear
    return Form {...}
 }

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

答案 2 :(得分:0)

尝试

.onAppear {
   UITableView.appearance().backgroundColor = .blue
}

答案 3 :(得分:0)

如果您不想修改Form的安全区域,也可以使用ZStack

struct ContentView: View {
    
    init(){
        
        UITableView.appearance().backgroundColor = .clear
    }
    
    @State var value = ""
    
    var body: some View {
        ZStack {
            Color(UIColor.systemYellow)
                .edgesIgnoringSafeArea(.all)
            Form {
                Section(header: Text("First Name")) {
                    TextField("First Name", text: $value)
                }
                Section(header: Text("Last Name")) {
                    TextField("Last Name", text: $value)
                }
            }
        }
    }
}

答案 4 :(得分:0)

上面的解决方案对于我要实现的目标并没有真正起作用。我希望表单的初始屏幕背景清晰,而随后的屏幕具有默认的iOS systemGroupedBackground颜色。对我而言,使用appear()和desire()无效,因为在各个选项卡之间切换会导致外观错误。

我想出了以下解决方案。它借鉴了上述解决方案。

对于ContentView屏幕,我将这段代码插入到Struct内。

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

这是一个影响所有表格的全局更改。

对于希望使用默认颜色的所有表单,我将这段代码插入了表单{}之外。

.background(Color(.systemGroupedBackground))