Swift中能否为Tab Bar项设置双色?(Swift初学者求助)
嘿,作为Swift新手碰到Tab Bar的样式问题太正常啦!我来帮你解决这个「双色图标+始终白色背景」的需求~
首先得搞清楚你之前的问题出在哪:系统默认会把Tab Bar Item的图片当成**模板图(Template Image)**来渲染,这时候不管你图片里原本有多少种颜色,所有非透明像素都会被统一替换成tintColor(激活时是系统默认的蓝色,未激活是灰色),所以你的白+黑PNG才会变成单色。
接下来给你几个靠谱的解决方案,按需选就行:
方案1:关闭图片的模板渲染模式(最简单)
这个方法直接让图片显示原本的双色,再配合Tab Bar整体白色背景就能搞定:
- 在Assets里设置:选中你的图标图片,打开右侧的Attributes Inspector,把「Render As」改成「Original Image」。
- 或者用代码设置:如果是动态加载图片,给图片加上
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
相关产品推荐
相关产品推荐

