iOS 15下UITabBarItem自定义文字、角标颜色不生效该如何解决?
解决方案
核心原因
iOS 15 对 UITabBar 渲染逻辑做了重构,直接对 UITabBarItem 设置的标题属性、角标颜色会被 UITabBarAppearance 配置的全局样式覆盖,必须通过外观对象统一配置才能生效。
适配代码
你可以在原有逻辑的基础上增加版本判断,同时兼容新旧系统:
private func updateTabBar() { guard let items = tabBar.items, tabViewControllers.count == items.count else { return } // iOS15+ 新适配逻辑 if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() // 配置普通状态下的Item文字属性 appearance.stackedLayoutAppearance.normal.titleTextAttributes = Self.normalAttributes // 如有需要可同时配置选中状态文字属性 // appearance.stackedLayoutAppearance.selected.titleTextAttributes = Self.selectedAttributes // 配置角标颜色 appearance.stackedLayoutAppearance.normal.badgeBackgroundColor = .customColor // 横竖屏、iPad适配可补充配置其他布局样式 // appearance.inlineLayoutAppearance.normal.titleTextAttributes = Self.normalAttributes // appearance.compactInlineLayoutAppearance.normal.titleTextAttributes = Self.normalAttributes // 赋值给两种状态的外观 tabBar.standardAppearance = appearance tabBar.scrollEdgeAppearance = appearance } // 保留原有逻辑兼容iOS14及更低版本 for (item, vc) in zip(items, tabViewControllers) { item.setTitleTextAttributes(Self.normalAttributes, for: .normal) item.badgeColor = .customColor } }
注意点
- 如果你的App存在横竖屏切换、iPad适配场景,需要同时给
inlineLayoutAppearance、compactInlineLayoutAppearance两个布局的外观做相同配置,避免横屏/平板场景下样式失效 - 选中态的文字、图片属性也需要对应配置到
stackedLayoutAppearance.selected下才会生效
内容的提问来源于stack exchange,提问作者Valentin Shamardin
相关产品推荐
相关产品推荐

