iPad端TabBar未选中项颜色不生效,iPhone端正常(Xcode14.3.1)
解决iPad端UITabBar未选中项颜色不生效问题
针对Xcode 14.3.1、最低部署目标iOS 12.0的场景,iPad端TabBar未选中项颜色不生效的核心原因是:iPad上的UITabBar在部分布局场景(如分屏、悬浮窗口)下会优先使用scrollEdgeAppearance,若仅配置standardAppearance,未选中状态的颜色设置可能不会生效。以下是具体解决方案:
方案1:全局配置TabBar外观
在App启动时统一设置全局TabBar的外观属性,确保iPhone和iPad都生效:
// 可放在AppDelegate的application(_:didFinishLaunchingWithOptions:)或SceneDelegate的scene(_:willConnectTo:options:)中 let tabBarAppearance = UITabBarAppearance() // 配置选中项颜色 tabBarAppearance.stackedLayoutAppearance.selected.iconColor = .systemBlue tabBarAppearance.stackedLayoutAppearance.selected.titleTextAttributes = [.foregroundColor: UIColor.systemBlue] // 配置未选中项颜色 tabBarAppearance.stackedLayoutAppearance.normal.iconColor = .lightGray tabBarAppearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.lightGray] // 同时设置standardAppearance和scrollEdgeAppearance,覆盖iPad的特殊布局场景 UITabBar.appearance().standardAppearance = tabBarAppearance UITabBar.appearance().scrollEdgeAppearance = tabBarAppearance
方案2:在自定义TabBarController中单独配置
如果仅需针对特定TabBarController设置,可在其viewDidLoad中配置:
class CustomTabBarController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() let appearance = UITabBarAppearance() // 配置选中状态 appearance.stackedLayoutAppearance.selected.iconColor = .yourSelectedColor appearance.stackedLayoutAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.yourSelectedColor] // 配置未选中状态 appearance.stackedLayoutAppearance.normal.iconColor = .yourUnselectedColor appearance.stackedLayoutAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.yourUnselectedColor] // 绑定到当前TabBar tabBar.standardAppearance = appearance tabBar.scrollEdgeAppearance = appearance // 兼容iOS 12(最低部署为12.0,此部分可选) if #available(iOS 13.0, *) {} else { tabBar.tintColor = .yourSelectedColor tabBar.unselectedItemTintColor = .yourUnselectedColor } } }
注意事项
- 避免单独使用
unselectedItemTintColor:在iOS 13+的iPad上,UITabBarAppearance的配置优先级高于旧属性,单独设置可能被覆盖。 - 检查是否有局部覆盖:确保没有在单个
UITabBarItem的代码中单独设置image或titleTextAttributes,否则会覆盖全局外观配置。
内容的提问来源于stack exchange,提问作者Chander Dhiman
相关产品推荐
相关产品推荐

