You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:45:07