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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:19:35