iOS TabBar 5个图标仅显示2个,设置alwaysOriginal仍未解决求助
解决TabBar仅部分图标显示的问题
我来帮你排查这个TabBar图标只显示2/5的问题,结合你的代码和iOS开发里常见的TabBar坑,咱们一步步来定位解决:
最可能的原因:图片资源加载失败
你的代码里已经设置了withRenderingMode(.alwaysOriginal),这个操作是对的,能避免TabBar默认的tintColor覆盖图标原色。但剩下3个图标不显示,大概率是图片找不到导致返回nil,可以从这几个方向检查:
1. 核对图片名称的准确性
UIImage(named:)对名称的大小写、符号完全敏感,比如你代码里写的是"shop_green",但Asset里的图片名可能是"Shop_Green"或者"shop-green",差一点都会加载失败。
你可以给每个图标加载加个验证,快速定位哪个图标出问题:
// 封装一个加载图标的工具方法,加日志和断言 func loadTabBarImage(named name: String) -> UIImage? { guard let image = UIImage(named: name)?.withRenderingMode(.alwaysOriginal) else { print("⚠️ 找不到TabBar图标:\(name)") assertionFailure("TabBar图标 \(name) 缺失!") // 运行时会直接报错提醒 return nil } return image }
然后用这个方法替换原来的图片赋值,运行后看控制台日志,就能知道哪个图标没加载到。
2. 检查图片资源的配置
- 确认所有图片都正确添加到了Asset Catalog中,没有被误删除;
- 检查Build Phases → Copy Bundle Resources里,是否包含了这些图片资源,有时候添加图片时没勾选target,会导致打包时没把图片放进app里;
- 虽然你用代码强制设置了渲染模式,但可以确认下Asset里的图片Render As设置是不是「Default」,如果设成了「Template Image」,理论上代码会覆盖,但也可以临时改成「Original Image」试试。
3. 其他排查方向
- TabBar颜色设置冲突:虽然用了
alwaysOriginal,但如果TabBar的tintColor或unselectedItemTintColor设置成了和图标原色完全一致,可能会导致视觉上看不到图标。你可以临时把TabBar背景色改成反差大的颜色,比如tabBar.backgroundColor = .white,再看看图标是否显示; - 确认viewControllers赋值正确:你的代码最后把5个导航控制器赋值给了
viewControllers,确保这段代码是在自定义的TabBarController类里执行的,没有被其他代码覆盖; - 指定Bundle加载图片:如果你的图片在自定义Bundle里,试试用完整的加载方法:
UIImage(named: "user_green", in: Bundle.main, compatibleWith: nil)?.withRenderingMode(.alwaysOriginal)
修改后的完整代码示例
把上面的验证方法整合进去,代码更简洁也更容易排查问题:
func setupTabBar() { func loadTabBarImage(named name: String) -> UIImage? { guard let image = UIImage(named: name)?.withRenderingMode(.alwaysOriginal) else { print("⚠️ 缺失TabBar图标:\(name)") assertionFailure("TabBar图标 \(name) 未找到!") return nil } return image } let homeController = UINavigationController(rootViewController: HomeViewController()) homeController.tabBarItem.image = loadTabBarImage(named: "menu_green") homeController.tabBarItem.selectedImage = loadTabBarImage(named: "menu_lightgreen") let statsController = UINavigationController(rootViewController: StatsViewController()) statsController.tabBarItem.image = loadTabBarImage(named: "stats_green") statsController.tabBarItem.selectedImage = loadTabBarImage(named: "stats_lightgreen") let addController = UINavigationController(rootViewController: AddViewController()) addController.tabBarItem.image = loadTabBarImage(named: "add_green") addController.tabBarItem.selectedImage = loadTabBarImage(named: "add_lightgreen") let shopController = UINavigationController(rootViewController: ShopViewController()) shopController.tabBarItem.image = loadTabBarImage(named: "shop_green") shopController.tabBarItem.selectedImage = loadTabBarImage(named: "shop_lightgreen") let userController = UINavigationController(rootViewController: ProfileViewController()) userController.tabBarItem.image = loadTabBarImage(named: "user_green") userController.tabBarItem.selectedImage = loadTabBarImage(named: "user_lightgreen") viewControllers = [homeController, statsController, addController, shopController, userController] }
按这个步骤排查,应该很快就能找到问题所在~
内容的提问来源于stack exchange,提问作者Michiel.T
相关产品推荐
相关产品推荐

