You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中toolbar放置元素时如何移除导航标题预留空白

SwiftUI 移除Toolbar导航标题预留空白方案

问题现象

在NavigationView中添加toolbar元素但未设置导航标题时,页面内容上方会默认预留一块导航标题的展示空白,复现代码如下:

NavigationView {
    VStack(spacing: 0) {
        List {
            ForEach((1...50), id: \.self) {
                Text("\($0)…")
            }
        }
    }.toolbar {
        Text("Hello World!")
    }
} 

解决方法

这块空白是系统导航栏默认的大标题占位导致的,根据项目支持的最低系统版本选择对应配置即可:

iOS 16+ 原生实现

添加两个导航栏修饰符,先切换为紧凑内联模式,再隐藏导航栏背景占位即可:

// 仅支持iOS16+时可将NavigationView替换为NavigationStack,修饰符效果一致
NavigationView {
    VStack(spacing: 0) {
        List {
            ForEach((1...50), id: \.self) {
                Text("\($0)…")
            }
        }
    }
    .toolbar {
        Text("Hello World!")
    }
    // 移除导航大标题预留空白
    .navigationBarTitleDisplayMode(.inline)
    .toolbarBackground(.hidden, for: .navigationBar)
}
  • .navigationBarTitleDisplayMode(.inline):将导航栏从默认的大标题高度模式切换为紧凑模式,消除大标题对应的大块高度占位
  • .toolbarBackground(.hidden, for: .navigationBar):隐藏导航栏默认的背景材质,去掉导航栏和页面内容之间的默认边距,让内容可以直接贴合toolbar元素底部

iOS 15及更早版本兼容

如果需要覆盖低版本系统,可以通过UINavigationBarAppearance将导航栏设为透明来消除占位:

NavigationView {
    VStack(spacing: 0) {
        List {
            ForEach((1...50), id: \.self) {
                Text("\($0)…")
            }
        }
    }
    .toolbar {
        Text("Hello World!")
    }
    .navigationBarTitleDisplayMode(.inline)
    .onAppear {
        let appearance = UINavigationBarAppearance()
        appearance.configureWithTransparentBackground()
        UINavigationBar.appearance().standardAppearance = appearance
        UINavigationBar.appearance().scrollEdgeAppearance = appearance
    }
}

注意:以上修改只会移除为导航标题预留的多余空白,toolbar元素本身需要的展示高度会被正常保留,不会造成内容遮挡。


内容的提问来源于stack exchange,提问作者Malachy Fernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:36:29