Xcode 13 下 viewController.tabBarItem.badgeColor 设置失效如何解决?
失效原因
从iOS 15(Xcode 13默认适配iOS 15 SDK)开始,UITabBarItem的badgeColor等旧属性优先级低于新推出的UITabBarAppearance体系,直接赋值不会生效,只有全局配置Appearance的逻辑可以跑通。
动态修改单个Tab角标颜色的适配方案
你可以直接修改对应ViewController关联的UITabBarItem的独立Appearance属性,不会影响全局配置和其他Tab的样式,适配代码如下:
func updateTabItemBadgeColor(for viewController: UIViewController, color: UIColor) { if #available(iOS 13.0, *) { // 读取原有itemAppearance,避免覆盖之前的全局字体、文字颜色等配置 let standardItemAppear = viewController.tabBarItem.standardAppearance ?? UITabBarItemAppearance() // 同步修改普通、选中状态下的角标背景色,按需调整 standardItemAppear.normal.badgeBackgroundColor = color standardItemAppear.selected.badgeBackgroundColor = color viewController.tabBarItem.standardAppearance = standardItemAppear // iOS 15+ 额外适配scrollEdge状态 if #available(iOS 15.0, *) { let scrollEdgeItemAppear = viewController.tabBarItem.scrollEdgeAppearance ?? UITabBarItemAppearance() scrollEdgeItemAppear.normal.badgeBackgroundColor = color scrollEdgeItemAppear.selected.badgeBackgroundColor = color viewController.tabBarItem.scrollEdgeAppearance = scrollEdgeItemAppear } } else { // iOS 13以下系统继续使用原有API viewController.tabBarItem.badgeColor = color } }
需要动态修改的时候直接调用上面的方法即可,修改后系统会自动刷新TabBar的展示效果。
注意事项
如果你的App支持横屏、iPad分屏等场景,还需要同步修改UITabBarItemAppearance的inlineLayoutAppearance、compactLayoutAppearance对应的角标属性,避免横竖屏切换后样式异常。
内容的提问来源于stack exchange,提问作者BiNo。
相关产品推荐
相关产品推荐

