SwiftUI NavigationView背景色

时间:2020-11-03 18:31:46

标签: swiftui swiftui-navigationview

我有一个ScrollViewVStack中显示项目列表,而不是使用List。我想复制一个.large导航栏标题的行为,其中背景色使用.systemGroupedBackground

这是我想要的List的行为。 Summary的背景是透明的。

enter image description here

这是使用ScrollView + VStack时的行为。请注意大导航栏的白色背景。

enter image description here

同时复制两者的代码是

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()
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您可以按照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)
        }
    }
}