Xcode14与iOS16环境下TabBar和NavigationBar颜色异常求助
问题解决方案(iOS 16 + Xcode 14)
一、导航栏颜色不生效的解决
iOS 15 开始,barTintColor 已被官方标记为过时,必须通过 UINavigationBarAppearance 配置导航栏样式。你不需要给每个导航控制器重复设置,全局配置一次即可覆盖所有导航栏,代码如下:
在 MainTabController 的 viewDidLoad 开头添加全局导航栏配置:
override func viewDidLoad() { super.viewDidLoad() // 全局配置导航栏外观 let navAppearance = UINavigationBarAppearance() navAppearance.configureWithOpaqueBackground() navAppearance.backgroundColor = .white // 统一设置标准样式和滚动边缘样式(解决下拉滚动时导航栏变色问题) UINavigationBar.appearance().standardAppearance = navAppearance UINavigationBar.appearance().scrollEdgeAppearance = navAppearance configureViewControllers() }
之后可以删掉 templateNavigationController 里的 nav.navigationBar.barTintColor = .white 代码,避免冗余。
二、TabBar 与背景同色的解决
用 UITabBarAppearance 配置 TabBar,设置区别于页面背景的颜色,增强区分度:
在 viewDidLoad 的全局配置里加上:
// 全局配置TabBar外观 let tabBarAppearance = UITabBarAppearance() tabBarAppearance.configureWithOpaqueBackground() tabBarAppearance.backgroundColor = UIColor.systemGray6 // 浅灰色,和白色页面区分 // 添加顶部阴影线,强化边界 tabBarAppearance.shadowColor = UIColor.systemGray4 UITabBar.appearance().standardAppearance = tabBarAppearance // iOS 15+ 需要额外配置滚动边缘样式 if #available(iOS 15.0, *) { UITabBar.appearance().scrollEdgeAppearance = tabBarAppearance }
三、关于是否需要重复设置导航栏外观的疑问
不需要重复设置。通过 UINavigationBar.appearance() 全局配置的样式,会自动应用到所有 UINavigationController 的导航栏上,既简洁又能保证样式统一。如果个别页面需要特殊样式,再单独覆盖即可。
修改后的完整代码
class MainTabController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() // 全局配置导航栏 let navAppearance = UINavigationBarAppearance() navAppearance.configureWithOpaqueBackground() navAppearance.backgroundColor = .white UINavigationBar.appearance().standardAppearance = navAppearance UINavigationBar.appearance().scrollEdgeAppearance = navAppearance // 全局配置TabBar let tabBarAppearance = UITabBarAppearance() tabBarAppearance.configureWithOpaqueBackground() tabBarAppearance.backgroundColor = UIColor.systemGray6 tabBarAppearance.shadowColor = UIColor.systemGray4 UITabBar.appearance().standardAppearance = tabBarAppearance if #available(iOS 15.0, *) { UITabBar.appearance().scrollEdgeAppearance = tabBarAppearance } configureViewControllers() } func configureViewControllers() { let feed = FeedController() let nav1 = templateNavigationController(image: UIImage(named: "home_unselected"), rootViewController: feed) let explore = ExploreController() let nav2 = templateNavigationController(image: UIImage(named: "search_unselected"), rootViewController: explore) let notifications = NotificationsController() let nav3 = templateNavigationController(image: UIImage(named: "search_unselected"), rootViewController: notifications) let conversations = ConversationsController() let nav4 = templateNavigationController(image: UIImage(named: "search_unselected"), rootViewController: conversations) viewControllers = [nav1, nav2, nav3, nav4] } func templateNavigationController(image: UIImage?, rootViewController: UIViewController) -> UINavigationController { let nav = UINavigationController(rootViewController: rootViewController) nav.tabBarItem.image = image // 已全局配置导航栏,这里删除barTintColor设置 return nav } }
内容的提问来源于stack exchange,提问作者korzas
相关产品推荐
相关产品推荐

