ios 如何在SwiftUI中更改窗体的背景颜色?

nwo49xxi  于 2023-02-26  发布在  iOS
关注(0)|答案(8)|浏览(409)

我想更改窗体的“浅灰色”背景色,但.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)

    }
}

xam8gpfp

xam8gpfp1#

iOS 16操作系统

通过将以下修改器应用于Form,可以隐藏默认背景以显示底层视图:

.scrollContentBackground(.hidden)

iOS 13和15
所有SwiftUI的List在iOS中都有一个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)
            }
        }
      /*.scrollContentBackground(.hidden)*/ // 👈 this line will work only on iOS 16 and above 
        .foregroundColor(Color.blue)
        .background(Color.yellow)
    }
}

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

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

恢复

由于UITableView.appearance().backgroundColor全局应用,你可以使用.onAppear修饰符在不同的视图中改变它(因为它是全局改变)。所以你可以使用另一个onAppearonDisappear将它 * 重置 * 回你想要的。
默认颜色为:
UIColor.systemGroupedBackground表示分组样式
UIColor.systemBackground表示普通样式
而且它们都自动支持暗模式和亮模式。

r8uurelv

r8uurelv2#

试试这个

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

ymdaylpp3#

Mojtaba Hosseini给出的答案是可行的,但是init()语句不是UITableView语句的好地方,因为它“硬编码”ContentView的init参数,在这种情况下,它没有任何初始化参数,所以一切都可以正常工作,但是如果@ObservedObject被添加到视图中,那么这将破坏init函数。
只需将UITable语句添加到body,显式返回Form并删除init(),这就简单多了。

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

然而,在Form上设置背景颜色通常会按预期工作。事实上,它在ContentView屏幕上不工作可能是一个bug。

nlejzf6q

nlejzf6q4#

不要更改全局appearance()

例如,你可以使用UITableView.appearance().backgroundColor = .redForm的背景色设置为红色。这可以在视图的init中进行,但是这会影响 everyListForm
或者,您可以使用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)
    }
}

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

.listRowBackground(Color.blue)
rkue9o1l

rkue9o1l5#

如果您不想修改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)
                }
            }
        }
    }
}
s6fujrry

s6fujrry6#

将这些代码复制到每个 * 表单 * 视图下面:

Form {
    // Your form view 
} 
.onAppear { // ADD THESE AFTER YOUR FORM VIEW
    UITableView.appearance().backgroundColor = .clear 
}
.onDisappear { // CHANGE BACK TO SYSTEM's DEFAULT
    UITableView.appearance().backgroundColor = .systemGroupedBackground 
} 
.background(.yellow) // Add your background color
6mw9ycah

6mw9ycah7#

上面的解决方案并没有真正达到我想要的效果。我想要一个有清晰背景的初始屏幕,随后的屏幕有默认的iOS systemGroupedBackground颜色。使用appearse()和dispense()对我来说并不奏效,因为在不同的标签页之间切换会导致外观上的错误。
我提出了下面的解决方案,它借鉴了上面的解决方案。
对于我的ContentView屏幕,我将此代码插入到了Struct中。

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

这是一个影响所有形式的全球性变化。
对于所有希望使用默认颜色的窗体,我将此代码插入到Form {}的外部。

.background(Color(.systemGroupedBackground))
kr98yfug

kr98yfug8#

适用于所有版本

看到这些解决方案后,我创建了一个修改器供您在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
            }
        }
    }
}

要使用它,你只需要更新后的形式.

Form {
     Text("Test text")
 }
 .frame(height: 400)
 .modifier(FormHiddenBackground())

相关问题