做iOS开发时,页面顶部的导航栏几乎是标配。无论是返回按钮、标题还是右侧的操作按钮,都得靠它来撑场面。在SwiftUI里,导航栏的设置不像UIKit那样直接操作UINavigationController,而是用声明式的方式去配置,一开始可能有点不习惯,但用熟了反而更顺手。
基础导航结构
SwiftUI里用 NavigationView 来提供导航容器,虽然在iOS 16+中它默认是隐式的,但显式写出来更容易控制。每个页面作为 NavigationLink 或直接放入其中,就能实现跳转。
var body: some View {
NavigationView {
List {
NavigationLink("进入详情页", destination: DetailView())
}
.navigationTitle("首页")
}
}
上面这段代码创建了一个列表页,点击后进入详情页。顶部的标题“首页”就是通过 .navigationTitle("首页") 设置的。
自定义导航栏标题
有时候标题不只是文字,可能需要图片或者自定义视图。这时候可以用 .navigationBarTitleDisplayMode() 配合 .toolbar() 来实现。
var body: some View {
VStack {
Text("欢迎使用本App")
}
.navigationTitle("")
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Image(systemName: "gear")
}
ToolbarItem(placement: .principal) {
HStack {
Image(systemName: "star.fill")
Text("我的主页")
.font(.headline)
}
}
}
}
这里把标题设为空字符串,并将显示模式改为 .inline,然后用 ToolbarItem 在中间位置放了一个带图标和文字的组合视图。这种设计在社交类或个人中心页面特别常见。
隐藏导航栏或调整透明度
某些页面比如启动页或图片浏览页,我们希望隐藏导航栏。可以通过 .navigationBarHidden(true) 实现。
var body: some View {
ImageView()
.navigationBarHidden(true)
}
如果想让导航栏半透明,保留毛玻璃效果,可以配合 .toolbarBackground() 使用:
.toolbarBackground(
Color.white.opacity(0.9),
for: .navigationBar
)
.toolbarBackground(.visible, for: .navigationBar)
这样既保持了背景可见性,又不会影响内容阅读。
左右按钮的添加
导航栏两侧加按钮也很常见,比如左上角的菜单按钮,右上角的编辑或保存按钮。
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button(action: toggleMenu) {
Image(systemName: "line.horizontal.3")
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button(action: saveData) {
Text("保存")
}
}
}
这样的布局在设置页或表单页非常实用,用户一眼就知道怎么操作。
适配不同设备
iPad上导航栏的行为和iPhone略有不同,尤其是拆分视图(Split View)下。建议在实际设备上多测试,必要时用 @Environment(\.horizontalSizeClass) 判断当前布局类型,动态调整导航行为。
另外,在 watchOS 或 macOS 中这些API也有差异,专注iOS开发的话不用太担心,但跨平台项目就得留点心了。