如何在 SwiftUI 中的 NavigationView 中设置 ScrollView 的背景颜色

kam*_*pro 17 ios swift swiftui

我无法ScrollView在 SwiftUI下设置背景颜色。当我使用.background(Color.red)背景时,背景被切断,因此它不会进入导航栏,并且滚动似乎被破坏了。我尝试了几个解决方案,但每个都不起作用。我有一个简单的视图层次结构

NavigationView {
    ScrollView([.vertical], showsIndicators: true) {
        VStack {
            ForEach(0...50, id: \.self) { _ in
                Text("Text text")
            }
        }
    }
    .navigationBarTitle("Title", displayMode: .large)
}
.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)

它按预期工作

在此处输入图片说明

现在,我想添加背景颜色,我尝试了以下解决方案

1

NavigationView {
    ScrollView([.vertical], showsIndicators: true) {
        VStack {
            ForEach(0...50, id: \.self) { _ in
                Text("Text text")
            }
        }
    }
    .background(Color.red)
    .navigationBarTitle("Title", displayMode: .large)
}
.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

2

NavigationView {
    ZStack {
        Color.red
        ScrollView([.vertical], showsIndicators: true) {
            VStack {
                ForEach(0...50, id: \.self) { _ in
                    Text("Text text")
                }
            }
        }
        .navigationBarTitle("Title", displayMode: .large)
    }
}
.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

3

NavigationView {
    ZStack {
        Color.red.edgesIgnoringSafeArea([.all])
        ScrollView([.vertical], showsIndicators: true) {
            VStack {
                ForEach(0...50, id: \.self) { _ in
                    Text("Text text")
                }
            }
        }
        .navigationBarTitle("Title", displayMode: .large)
    }
}
.navigationViewStyle(StackNavigationViewStyle())
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

如何在ScrollViewpacked in下设置背景色NavigationView

// 编辑:

下面的动画呈现了一个理想的效果(它是用 UIKit 制作的)。

在此处输入图片说明

use*_*580 7

在用尽所有可能性之后,我找到了以下解决方案,该解决方案非常适合您想要实现的目标。

struct DemoView: View {
    
    init(){
        let navigationBarAppearance = UINavigationBarAppearance()
        navigationBarAppearance.backgroundColor = UIColor.red
        UIScrollView.appearance().backgroundColor = UIColor.red
    }
    
    var body: some View {

        NavigationView{
                ScrollView{
                    VStack{   
                        ForEach(0..<30, id: \.self){ _ in
                                Text("Text Text").foregroundColor(Color.black)
                        }
                    }.frame(maxWidth: .infinity)
                     .background(Color(UIColor.red))
            
            }.navigationBarTitle("Title")
        }  
    }
}

Run Code Online (Sandbox Code Playgroud)

希望这可以帮助;)


39f*_*edy 0

你可以这样:

struct ContentView: View {
    init() {
        //Use this if NavigationBarTitle is with Large Font
        UINavigationBar.appearance().backgroundColor = .red
    }
    var body: some View {
        NavigationView {
            ScrollView([.vertical], showsIndicators: true) {
                VStack {
                    ForEach(0...70, id: \.self) { _ in
                        Text("Text text")
                    }
                }.frame(minWidth: 0, maxWidth: .infinity)
                    .background(Color(UIColor.red))
            }
            .navigationBarTitle("Title", displayMode: .large)
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }
}
Run Code Online (Sandbox Code Playgroud)

它将产生一个如下所示的视图: 在此输入图像描述

在此输入图像描述

我知道这不是完整的解决方案,因为顶部安全边缘,但希望它可以帮助您更接近。

PS 我尝试忽略顶部安全边缘,但这会导致导航栏间距问题

  • 哈哈,SwiftUI还没有完全开发出来。 (2认同)