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

Swift中能否为Tab Bar项设置双色?(Swift初学者求助)

嘿,作为Swift新手碰到Tab Bar的样式问题太正常啦!我来帮你解决这个「双色图标+始终白色背景」的需求~

首先得搞清楚你之前的问题出在哪:系统默认会把Tab Bar Item的图片当成**模板图(Template Image)**来渲染,这时候不管你图片里原本有多少种颜色,所有非透明像素都会被统一替换成tintColor(激活时是系统默认的蓝色,未激活是灰色),所以你的白+黑PNG才会变成单色。

接下来给你几个靠谱的解决方案,按需选就行:


方案1:关闭图片的模板渲染模式(最简单)

这个方法直接让图片显示原本的双色,再配合Tab Bar整体白色背景就能搞定:

  1. 在Assets里设置:选中你的图标图片,打开右侧的Attributes Inspector,把「Render As」改成「Original Image」。
  2. 或者用代码设置:如果是动态加载图片,给图片加上alwaysOriginal渲染模式:
let tabIcon = UIImage(named: "yourDoubleColorIcon")?.withRenderingMode(.alwaysOriginal)
tabBarItem.image = tabIcon
tabBarItem.selectedImage = tabIcon // 激活/未激活用同一张图的话就这么写

然后给Tab Bar设置白色背景:

// 在TabBarController的viewDidLoad里写
tabBar.backgroundColor = .white
// 可选:去掉TabBar底部的阴影线
tabBar.shadowImage = UIImage()
tabBar.backgroundImage = UIImage()

这样一来,图标会保留原本的双色,整个Tab Bar背景都是白色,完美符合你的需求~


方案2:自定义Tab Bar Item视图(更灵活)

如果需要更精细的控制(比如每个Item单独的白色背景、调整图标和文字的位置),可以直接给每个TabBarItem设置自定义视图:

先写一个创建自定义Item的工具方法:

func makeCustomTabItem(imageName: String, title: String) -> UIView {
    // 容器视图,背景设为白色
    let container = UIView(frame: CGRect(x: 0, y: 0, width: 60, height: 49))
    container.backgroundColor = .white
    
    // 双色图标(开启原始渲染模式)
    let iconView = UIImageView(image: UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal))
    iconView.frame = CGRect(x: 15, y: 8, width: 30, height: 30)
    
    // 标题文字
    let titleLabel = UILabel(frame: CGRect(x: 0, y: 38, width: 60, height: 11))
    titleLabel.text = title
    titleLabel.textAlignment = .center
    titleLabel.font = .systemFont(ofSize: 10)
    
    container.addSubview(iconView)
    container.addSubview(titleLabel)
    return container
}

然后在TabBarController里给每个Item赋值:

override func viewDidLoad() {
    super.viewDidLoad()
    
    guard let tabItems = tabBar.items else { return }
    
    // 给第一个Tab设置自定义视图
    tabItems[0].customView = makeCustomTabItem(imageName: "homeIcon", title: "首页")
    // 第二个Tab同理
    tabItems[1].customView = makeCustomTabItem(imageName: "profileIcon", title: "我的")
    
    // 如果需要去掉TabBar整体的背景色(让只有Item是白色)
    tabBar.backgroundColor = .clear
}

方案3:用SF Symbols实现双色(适合用系统图标的情况)

如果你用的是苹果的SF Symbols,可以直接配置多色符号,不用自己切图:

// 配置双色(比如黑色+灰色)
let multiColorConfig = UIImage.SymbolConfiguration(paletteColors: [.black, .gray])
// 生成带多色配置的图标,开启原始渲染模式
let tabIcon = UIImage(systemName: "house.fill", withConfiguration: multiColorConfig)?.withRenderingMode(.alwaysOriginal)
// 给TabBarItem赋值
tabBarItem.image = tabIcon

最后提醒一下:如果需要激活和未激活状态下的双色图标不一样,只要分别准备两张图,设置tabBarItem.image(未激活)和tabBarItem.selectedImage(激活)就行啦~

内容的提问来源于stack exchange,提问作者Ryoko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:02:43