代码之家  ›  专栏  ›  技术社区  ›  Jan

SwiftUI导航视图背景色

  •  0
  • Jan  · 技术社区  · 4 年前

    ScrollView VStack 而不是使用 List .large 背景色使用 .systemGroupedBackground

    列表 我想要的。背景 Summary 是透明的。

    enter image description here

    这就是我在使用 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()
            }
        }
    }
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   Nikolai    4 年前

    您可以引入自定义ViewModifier,如前所述 here

    工作示例:

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