簡體   English   中英

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

[英]Using a custom background behind NavigationStack in SwiftUI

這應該很簡單,但我無法找到如何在 NavigationStack 后面放置背景。 使用 NavigationView,只需在 ZStack 中嵌入一個在 NavigationView 之前調用背景視圖的問題(如舊帖子中所述: How change background color if using NavigationView in SwiftUI? )同樣的技術對 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

僅供參考,我在其他應用程序(使用 NavigationView)中使用了相同的 MyAngularGradient() 有什么想法嗎? 謝謝。

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

struct MyView: View {

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

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

}

由於以下原因,這有些令人不滿意:

  1. 當您向上滾動時,導航欄會按預期出現,但會破壞效果 imo。

我想您可以通過在視圖的構造函數中更新UINavigationBarAppearance()來嘗試以有限的方式更改它。

上面的非滾動圖像 上面的滾動版本

  1. 如果TabView中有多個基於NavigationStackView的視圖,則無法將背景應用於整個應用程序。 (我上面的例子是在TabView中)

  2. 當一個新視圖被推入堆棧時,自定義背景就會消失。

  3. 由於.scrollContentBackground(.hidden)修飾符,僅適用於 iOS 16+。

  4. 如果您使用 ForEach 填充List則不起作用。 有趣的是,如果您在使用和不使用ForEach的情況下調試層次結構,您會看到 SwiftUI 添加了一個新視圖 controller,對於ForEach而言它是不透明的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM