簡體   English   中英

SwiftUI:兩個並排列表和一個 NavigationView 的意外行為

[英]SwiftUI: unexpected behavior with two List side by side and a NavigationView

我有一個屏幕,在NavigationView中並排有兩個List 布局正確呈現,我可以獨立滾動兩個列表。 問題是,當我滾動第一個列表時,它會在導航欄后面移動,而不會觸發對其應用背景色的效果。 這是一個顯示正在發生的事情的 gif:

在此處輸入圖像描述

這是我用於此視圖的代碼:

struct ContentView: View {

    var body: some View {
        NavigationView {
            HStack(spacing: 0) {
                List {
                    Section(header: Text("Header left")) {
                        ForEach(0..<600) { integer in
                            Text("\(integer)")
                        }
                    }
                }
                .listStyle(InsetGroupedListStyle())
                .frame(minWidth: 0, maxWidth: .infinity)

                List {
                    Section(header: Text("Header right")) {
                        ForEach(0..<400) { integer in
                            Text("\(integer)")
                        }
                    }
                }
                .listStyle(InsetGroupedListStyle())
                .frame(minWidth: 0, maxWidth: .infinity)
            }
            .navigationTitle("Example")
        }
        .navigationViewStyle(StackNavigationViewStyle())
    }

}

這會是 SwiftUI 錯誤嗎? 如果沒有,我怎樣才能使第一個列表在滾動時與導航欄正確交互?

我最終禁用了UINavigationBar的大標題和透明度。

import Introspect

@State private var navigationBar: UINavigationBar?

HStack(spacing: 0) {
    ...
}
.navigationBarTitleDisplayMode(.inline)
.introspectNavigationController {
    $0.navigationBar.scrollEdgeAppearance = $0.navigationBar.standardAppearance
    navigationBar = $0.navigationBar
}
.onDisappear {
    navigationBar?.scrollEdgeAppearance = nil
    navigationBar = nil
}

要訪問UINavigationController ,我使用了 SwiftUI Introspect lib

這是一個錯誤。 NavigationViewNavigationStack的工作方式,它們只考慮其內容中最后出現的ListScrollView來為導航欄設置動畫。

我現在能想到的唯一解決方法是:

  1. 使用.navigationBarHidden(true).toolbar(.hidden) (對於 iOS 16+)修飾符隱藏導航欄
  2. 將導航欄固定到位
.navigationBarTitleDisplayMode(.inline)
.toolbarBackground(Color.white, for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)

對於 iOS 16+ 或通過玩UINavigationBarAppearance的 UIKit-ish 方式對於舊的 iOS 版本

  1. 實現您自己的導航欄,使用幾何閱讀器跟蹤列表,並根據列表位置執行 animation,但這里的努力是不值得的。

暫無
暫無

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

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