SwiftUI NavigationView 背景颜色
SwiftUI NavigationView background color
我有 ScrollView
在 VStack
中显示项目列表,而不是使用 List
。我想复制背景颜色使用 .systemGroupedBackground
的 .large
导航栏标题的行为
这是我想要的 List
的行为。 Summary
的背景是透明的。
这是我在使用 ScrollView
+ VStack
时得到的行为。注意大导航栏的白色背景。
重现两者的代码是
import SwiftUI
struct MyContentView: View {
var body: some View {
NavigationView {
ScrollView {
VStack(spacing: 8) {
Text("One")
.roundedContainer()
Text("Two")
.roundedContainer()
}
.padding()
}
.background(Color(.systemGroupedBackground))
.navigationBarTitle("Summary", displayMode: .large)
}
}
}
struct MyListContentView: View {
var body: some View {
NavigationView {
List{
Text("One")
.padding()
Text("Two")
.padding()
}
.listStyle(InsetGroupedListStyle())
.navigationBarTitle("Summary", displayMode: .large)
}
}
}
extension View {
func roundedContainer() -> some View {
self
.frame(maxWidth: .infinity)
.padding(.vertical)
.background(Color.white)
.cornerRadius(10)
}
}
struct MyContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
MyContentView()
MyListContentView()
}
}
}
您可以按照 here 所述引入自定义 ViewModifier。
工作示例:
import SwiftUI
struct NavigationBarModifier: ViewModifier {
var backgroundColor: UIColor?
init(backgroundColor: UIColor?) {
self.backgroundColor = backgroundColor
}
func body(content: Content) -> some View {
ZStack{
content
VStack {
GeometryReader { geometry in
Color(self.backgroundColor ?? .clear)
.frame(height: geometry.safeAreaInsets.top)
.edgesIgnoringSafeArea(.top)
Spacer()
}
}
}
}
}
extension View {
func navigationBarColor(_ backgroundColor: UIColor?) -> some View {
self.modifier(NavigationBarModifier(backgroundColor: backgroundColor))
}
}
struct MyContentView: View {
var body: some View {
NavigationView {
ScrollView {
VStack(spacing: 8) {
Text("One")
.roundedContainer()
Text("Two")
.roundedContainer()
}
.padding()
}
.background(Color(.systemGroupedBackground))
.navigationBarTitle("Summary", displayMode: .large)
.navigationBarColor(.systemGroupedBackground)
}
}
}
我有 ScrollView
在 VStack
中显示项目列表,而不是使用 List
。我想复制背景颜色使用 .systemGroupedBackground
.large
导航栏标题的行为
这是我想要的 List
的行为。 Summary
的背景是透明的。
这是我在使用 ScrollView
+ VStack
时得到的行为。注意大导航栏的白色背景。
重现两者的代码是
import SwiftUI
struct MyContentView: View {
var body: some View {
NavigationView {
ScrollView {
VStack(spacing: 8) {
Text("One")
.roundedContainer()
Text("Two")
.roundedContainer()
}
.padding()
}
.background(Color(.systemGroupedBackground))
.navigationBarTitle("Summary", displayMode: .large)
}
}
}
struct MyListContentView: View {
var body: some View {
NavigationView {
List{
Text("One")
.padding()
Text("Two")
.padding()
}
.listStyle(InsetGroupedListStyle())
.navigationBarTitle("Summary", displayMode: .large)
}
}
}
extension View {
func roundedContainer() -> some View {
self
.frame(maxWidth: .infinity)
.padding(.vertical)
.background(Color.white)
.cornerRadius(10)
}
}
struct MyContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
MyContentView()
MyListContentView()
}
}
}
您可以按照 here 所述引入自定义 ViewModifier。
工作示例:
import SwiftUI
struct NavigationBarModifier: ViewModifier {
var backgroundColor: UIColor?
init(backgroundColor: UIColor?) {
self.backgroundColor = backgroundColor
}
func body(content: Content) -> some View {
ZStack{
content
VStack {
GeometryReader { geometry in
Color(self.backgroundColor ?? .clear)
.frame(height: geometry.safeAreaInsets.top)
.edgesIgnoringSafeArea(.top)
Spacer()
}
}
}
}
}
extension View {
func navigationBarColor(_ backgroundColor: UIColor?) -> some View {
self.modifier(NavigationBarModifier(backgroundColor: backgroundColor))
}
}
struct MyContentView: View {
var body: some View {
NavigationView {
ScrollView {
VStack(spacing: 8) {
Text("One")
.roundedContainer()
Text("Two")
.roundedContainer()
}
.padding()
}
.background(Color(.systemGroupedBackground))
.navigationBarTitle("Summary", displayMode: .large)
.navigationBarColor(.systemGroupedBackground)
}
}
}