Tab Bar — 位于移动应用屏幕底部的导航元素,可快速访问主要部分。在 iOS 上通过 UITabBarController 实现,在 Android 上通过 BottomNavigationView Material Design 实现。有关导航原则的更多信息,请阅读 Human Interface Guidelines Apple。
主要要点
Tab Bar(标签栏) — 位于移动应用屏幕底部的图形界面元素。它提供对应用 3–5 个主要部分的快速访问。每个部分由一个图标和文本标签表示。用户点击标签以切换到相应部分。Tab Bar 在每个部分内的所有屏幕上保持可见,提供恒定的入口点。
Apple 建议将 Tab Bar 用于重要性相同的应用部分。Human Interface Guidelines(2026)指出:「Tab Bar 显示 3–5 个标签。如果需要更多 — 最后一个标签变为「更多」点,其余包含在内」。Google 的 Material Design(2026)推荐 Bottom Navigation 用于相同目的 — 3–5 个点,活动标签通过颜色和动画突出显示。
与顶部标签(Top Tab Bar)不同,底部面板更适合单手操作 — 拇指自然够到屏幕底部。Nielsen Norman Group(2025)的研究表明,在屏幕对角线为 6 英寸及以上的智能手机上,底部导航比顶部导航的任务完成时间缩短了 22%。
UITabBarController — iOS 内置的用于通过标签组织导航的控制器。每个标签管理自己的屏幕集,通常组织在 UINavigationController 中。UITabBarController 在屏幕底部自动创建 Tab Bar,具有系统半透明背景和切换动画。
import UIKit
class MainTabBarController: UITabBarController {
override func viewDidLoad() {
super.viewDidLoad()
let homeVC = HomeViewController()
let searchVC = SearchViewController()
let profileVC = ProfileViewController()
homeVC.tabBarItem = UITabBarItem(
title: "首页",
image: UIImage(systemName: "house.fill"),
tag: 0
)
searchVC.tabBarItem = UITabBarItem(
title: "搜索",
image: UIImage(systemName: "magnifyingglass"),
tag: 1
)
profileVC.tabBarItem = UITabBarItem(
title: "个人资料",
image: UIImage(systemName: "person.circle.fill"),
tag: 2
)
let homeNav = UINavigationController(rootViewController: homeVC)
let searchNav = UINavigationController(rootViewController: searchVC)
let profileNav = UINavigationController(rootViewController: profileVC)
viewControllers = [homeNav, searchNav, profileNav]
}
}示例中的每个标签都包含 UINavigationController,允许在部分内使用堆栈导航。tabBarItem 配置图标、标题和徽章。系统自动为图标应用 SF Symbols 样式 — 支持动态类型和多色功能的 Apple 标准符号。
BottomNavigationView — 来自 Material Design Library 的 Android 组件,实现底部导航面板。在 Android 13+ 中使用 NavigationBarView — 其后续版本,具有改进的动画和自适应行为。BottomNavigationView 遵循 Material Design 3(Material You)规范,支持应用主题、动态颜色和切换动画。
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val navView: NavigationBarView = binding.navView
val navController = findNavController(R.id.nav_host_fragment)
// 将 BottomNavigation 连接到 NavController
navView.setupWithNavController(navController)
// 在通知标签上配置徽章
val badge = navView.getOrCreateBadge(R.id.navigation_notifications)
badge.isVisible = true
badge.number = 12
}
}BottomNavigationView 组件支持 Material Design 3 的三种样式:default(标签 + 图标)、labeled(放大标签)和 unlabeled(仅图标)。setupWithNavController 方法将面板连接到 Navigation Component,在屏幕变化时自动更新活动标签。徽章通过 getOrCreateBadge 创建,支持数字和点状指示器。
徽章 — 标签图标上的数字或点状指示器,显示通知、新消息或任务的数量。在 iOS 中,徽章通过 UITabBarItem 上的 badgeValue 属性设置。在 Android 中,徽章通过 BadgeDrawable(Material 3)或 NavigationBarView 中的 getOrCreateBadge 管理。
徽章是强大的参与工具:Localytics(2025)的研究表明,带有徽章的应用在第 7 天的留存率高出 18%。然而,过度使用徽章(同时超过 3 个)会使点击率降低 12%。Apple 和 Google 建议仅对相关通知显示徽章,并在打开部分时将其重置。
| 平台 | 组件 | 设置徽章 |
|---|---|---|
| iOS | UITabBarItem.badgeValue | tabBarItem.badgeValue = "5" |
| Android | BadgeDrawable | badge.number = 5 |
| iOS | 点状徽章 | tabBarItem.badgeColor = .red |
| Android | 点状指示器 | badge.isVisible = true |
两个平台都为自定义 Tab Bar 提供了广泛的可能性。在 iOS 中,可以更改背景颜色、活动标签的色调、标签字体,并通过 SF Symbols 或自己的资源添加自定义图标。在 Android 中,自定义包括 Material 3 样式、切换动画、涟漪效果和基于壁纸的动态颜色。
// 在 iOS 中自定义 Tab Bar
let appearance = UITabBarAppearance()
appearance.backgroundColor = .systemBackground
appearance.stackedLayoutAppearance.normal.titleTextAttributes = [
.foregroundColor: UIColor.secondaryLabel,
.font: UIFont.systemFont(ofSize: 11)
]
appearance.stackedLayoutAppearance.selected.titleTextAttributes = [
.foregroundColor: UIColor.systemBlue,
.font: UIFont.boldSystemFont(ofSize: 12)
]
tabBar.standardAppearance = appearance.在 Android 中,BottomNavigationView 的自定义通过 XML 属性或编程方式完成。Material 3 引入了动态颜色的概念:调色板从用户的壁纸生成并自动应用于组件。开发人员可以通过主题覆盖颜色,设置自定义下划线动画(indicator)并配置涟漪效果。
// 在 Android 中自定义 BottomNavigationView
val navView = findViewById<NavigationBarView>(R.id.nav_view)
with (navView) {
labelVisibilityMode = NavigationBarView.LABEL_VISIBILITY_LABELED
itemActiveIndicatorStyle = R.style.CustomIndicator
itemRippleColor = ColorStateList.valueOf(
Color.valueOf("#FFE0B2")
)
}
// 在 XML 中:app:menu="@menu/bottom_nav_menu"
// 在 XML 中:app:itemActiveIndicatorStyle="@style/Widget.Material3.BottomNavigationView.ActiveIndicator"在设计 Tab Bar 时,遵循平台建议和可用性研究非常重要。Apple HIG:不超过 5 个标签,简洁文本,语义图标。Material Design:3–5 个点,活动点突出显示,徽章计数器不超过 99。NN Group(2025):底部导航应在部分的所有屏幕上保持可见,否则用户会失去上下文。
主要错误:6 个以上标签(强制使用「更多」 — 降低可发现性),导航时标签顺序改变(迷失方向),在嵌套屏幕上隐藏 Tab Bar(失去导航锚点)。最佳实践 — 固定顺序,统一图标和文本标签,徽章仅用于用户操作(不用于营销)。
常见问题
Apple 和 Google 推荐 3–5 个标签。少于三个 — 没有足够的部分来证明底部面板的合理性。超过五个 — 注意力超载,最后一个标签变为「更多」点。根据 NN Group(2025)的数据,最佳数量是 4 个标签。
Tab Bar — Apple 对 iOS 底部面板(UITabBarController)的术语。Bottom Navigation — 在 Android 中的对应物(BottomNavigationView)。功能上相同:快速访问 3–5 个部分。视觉风格上的差异:iOS — 带有模糊效果的半透明背景,Android — 带有涟漪效果的固定颜色。
可以,但要谨慎。在 iOS 中 — UIViewController 上的 hidesBottomBarWhenPushed = true。在 Android 中 — BottomNavigationView 上的 View.GONE。最佳实践 — 仅在全屏屏幕(查看照片、视频)上隐藏,但在返回时恢复。长时间隐藏会让用户迷失方向。
在 iOS 中设置 tabBarItem.badgeValue = "N"(作为字符串)。在 Android 中使用 NavigationBarView 上的 getOrCreateBadge(resId)。徽章自动显示为带有数字的红色圆圈。重置:badgeValue = nil(iOS),removeBadge(resId)或 badge.isVisible = false(Android)。
在带有 Home Indicator 的设备上(iPhone X 及更新机型),Tab Bar 会自动升高到指示器上方。系统在屏幕底部添加 Safe Area Insets。开发人员无需手动调整边距 — UIKit 和 Android SystemUI 会自动处理。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。