【问题标题】:Hide top space in SwiftUI's NavigationView在 SwiftUI 的 NavigationView 中隐藏顶部空间
【发布时间】:2023-01-28 07:53:49
【问题描述】:

我无法删除 NavigationView 中的顶部空间。

您可以看到,在第一个屏幕中,我有“工作筛选器”标题,例如在点击 Company 选择器时,该标题稍后会显示在后退按钮中,但标题过去占据的空间现在是空的。如何删除?

主体的视图变量是:

var body: some View {
        NavigationView {
            Form {
                ...
                ...
                Picker("FilterView.Company".localized, selection: $draft.company) {
                    SearchBar(searchText: $searchText)
                    Text("FilterView.Company.AllCompanies".localized).tag(nil as Company?)
                    if searchText.isEmpty {
                        ForEach(companiesFetchedResults) {
                            Text($0.companyName).tag($0 as Company?)
                        }
                    } else {
                        ForEach(companiesFetchedResults.filter {
                            $0.companyName.contains(searchText)
                        }) {
                            Text($0.companyName).tag($0 as Company?)
                        }
                    }
                }
            }
            .navigationBarTitle("FilterViewTitle".localized)
            .toolbar {
                ToolbarItem(placement: .navigationBarLeading) { cancel }
                ToolbarItem(placement: .navigationBarTrailing) { done }
            }
        }
    }

编辑

正如@Stefan 所建议的,我已经设法将 Form 提取到一个单独的视图中,但它仍然不起作用:

FilterView:

var body: some View {
        NavigationView {
            FormView(draft: $draft)
                .navigationBarTitle("FilterViewTitle".localized)
                .toolbar {
                    ToolbarItem(placement: .navigationBarLeading) { cancel }
                    ToolbarItem(placement: .navigationBarTrailing) { done }
                }
        }
    }

FormView:

var body: some View {
        VStack {
            Form {
                ...
                ...
                Picker("FilterView.Company".localized, selection: draft.company) {
                    SearchBar(searchText: $searchText)
                    Text("FilterView.Company.AllCompanies".localized).tag(nil as Company?)
                    if searchText.isEmpty {
                        ForEach(companiesFetchedResults) {
                            Text($0.companyName).tag($0 as Company?)
                        }
                    } else {
                        ForEach(companiesFetchedResults.filter {
                            $0.companyName.contains(searchText)
                        }) {
                            Text($0.companyName).tag($0 as Company?)
                        }
                    }
                }
            }
        }.navigationBarTitleDisplayMode(.inline)
    }

【问题讨论】:

  • 使用.navigationBarTitle("Test", displayMode: .inline)
  • 我试过,将它设置为FormPicker 级别,但结果是只有第一个屏幕以内联模式显示标题(作业过滤器),但第二个屏幕保持不变
  • 这是大标题区域,如果我们使用它,我们不能删除它,但我们可以用其他标题填充它,如stackoverflow.com/a/63591598/12299030。另一种方法是不使用大标题模式。
  • 但我不会在文件中更改它;我使用的唯一一个是.navigationBarTitle("FilterViewTitle".localized),如我在上面粘贴的代码中所示

标签: swift swiftui swiftui-navigationview


【解决方案1】:

您需要将 navigationBarTitleDisplayMode 显式设置为内联,这应该可以解决您的问题:

.navigationBarTitleDisplayMode(.inline)

编辑:

Why is there a huge big gap between the back button and the starting element of the view?

长话短说: 不要在 NavigationView 中嵌入推送视图

【讨论】:

  • 它没有解决它:它只是以内联模式显示“作业过滤器”,但第二个屏幕保持不变:(
  • 啊,我明白了。您已将其嵌入到 NavigationView 中。只需从 NavigationView 中提取推送的视图:stackoverflow.com/questions/72085494/…
  • 仍然,将 Form 提取到另一个视图并使用 .navigationBarTitleDisplayMode(.inline) 时,结果相同
  • @noloman 你能分享你更新的过滤器视图代码吗?
  • 我刚刚更新了原始问题,谢谢!