iOS15下如何为不同UITabBarItem单独设置差异化文字颜色
iOS 15+ 下单个UITabBarItem动态修改文字颜色解决方案
核心原因
iOS 15 引入UITabBarAppearance体系后,UITabBar全局配置的standardAppearance/scrollEdgeAppearance优先级高于单个UITabBarItem的setTitleTextAttributes方法,直接修改item的属性会被全局配置覆盖,因此原有方案失效。
解决方案
你需要为需要自定义样式的UITabBarItem单独创建专属的外观配置对象,再赋值给对应的item属性即可生效,完整兼容iOS 15+及更低版本的代码如下:
let indexOfItemToChange = 4 guard let targetItem = tabBar.items?[indexOfItemToChange] else { return } if #available(iOS 15, *) { // 1. 创建独立的UITabBarAppearance实例,不要直接复用全局的配置实例 let customAppearance = UITabBarAppearance() // 先继承全局基础配置,保持背景等样式和其他item一致 customAppearance.configureWithDefaultBackground() customAppearance.backgroundColor = .grey // 和你全局配置的TabBar背景色保持一致 // 2. 单独配置该item的文字颜色 customAppearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor: UIColor.green] customAppearance.stackedLayoutAppearance.selected.titleTextAttributes = [.foregroundColor: UIColor.red] // 3. 把自定义配置赋值给目标item的两个外观属性 targetItem.standardAppearance = customAppearance targetItem.scrollEdgeAppearance = customAppearance } else { // 低版本沿用原有方案 targetItem.setTitleTextAttributes([.foregroundColor: UIColor.red], for: .selected) targetItem.setTitleTextAttributes([.foregroundColor: UIColor.green], for: .normal) } // 强制刷新TabBar使样式立即生效 tabBar.setNeedsLayout() tabBar.layoutIfNeeded()
注意事项
- 不要直接修改全局UITabBarAppearance的属性,必须为自定义item创建新的独立配置实例,UITabBarAppearance为值类型,复用会导致全局样式被修改
- 必须同时给item的
standardAppearance和scrollEdgeAppearance两个属性赋值,否则滚动到边缘时样式会不生效 - 运行时动态修改后需要调用刷新方法,避免样式延迟生效
内容的提问来源于stack exchange,提问作者Dmytro Yashchenko
相关产品推荐
相关产品推荐

