繁体   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