在 SwiftUI 中使用 NavigationStack 背后的自定义背景

Hyo*_*sha 4 swiftui swiftui-navigationstack

这应该很简单,但我不知道如何在 NavigationStack 后面放置背景。对于 NavigationView,只需嵌入 ZStack 中,并在 NavigationView 之前调用背景视图即可(如旧文章中所述:如果在 SwiftUI 中使用 NavigationView,如何更改背景颜色?)相同的技术对我来说不适用于 NavigationStack 。这是我所拥有的:

   struct MyAngularGradient: View {
    var body: some View {
        ZStack {
            AngularGradient(gradient: Gradient(colors: [.red, .orange , .yellow, .green, .cyan, .blue, .indigo, .purple, .red]), center: .leading)
            AngularGradient(gradient: Gradient(colors: [.red, .orange , .yellow, .green, .cyan, .blue, .indigo, .purple, .red]), center: .leading)
                .offset(x: -8)
        }
        .ignoresSafeArea()
    }
}

var body: some View {
            ZStack{
                MyAngularGradient()
                NavigationStack {
                  ...
                }
                 .navigationViewStyle(.stack)
             } // end ZStack
Run Code Online (Sandbox Code Playgroud)

仅供参考,我在其他应用程序(带有 NavigationView)中使用了相同的 MyAngularGradient() 有什么想法吗?谢谢。

bri*_*ndy 7

到目前为止我最接近的是:

struct MyView: View {

    var body: some View {
        NavigationStack {
            ZStack {
                Color.pink.ignoresSafeArea()

                List {
                    NavigationLink("Hello") {
                        Text("Hello")
                    }
                }
                .navigationTitle("Title")
            }
        }
        .scrollContentBackground(.hidden)
    }

}
Run Code Online (Sandbox Code Playgroud)

但有些令人不满意,原因如下:

  1. 当您向上滚动时,导航栏会按预期出现,但在我看来破坏了效果。

UINavigationBarAppearance()我想您可以通过在视图的构造函数中更新它来尝试以有限的方式更改它。

上面的非滚动图像 以上内容的滚动版本

  1. 如果NavigationStackView.TabView​ (我上面的例子是在 a 中TabView

  2. 当新视图被推入堆栈时,自定义背景消失。

  3. 由于.scrollContentBackground(.hidden)修饰符的原因,仅适用于 iOS 16+。

  4. 如果您使用 ForEach 填充List. 有趣的是,如果您调试带有或不带有 的层次结构,ForEach您会发现 SwiftUI 添加了一个新的视图控制器,在ForEach.

  • 谢谢布林迪抽出时间来回答。我尝试了你的建议,但立即取得了有限的成功。我会继续尝试,如果/当我得到我希望的效果时,我一定会更新这篇文章。同时,感谢您让我朝着(我认为的)正确的方向前进。 (2认同)