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

TabBarItem多次点击后缩放异常,如何设置更大图标并修复?

修复TabBarItem图片重复缩放问题并设置更大图标

嘿,我来帮你搞定这个TabBarItem越点越大的问题,顺便教你怎么设置更大的图标~

问题出在哪?

你遇到的图片持续放大的问题,大概率是这段配置代码被重复执行了——比如不小心把代码放在了viewWillAppear这类会多次触发的方法里,每次执行时都会在已经调整过的图片基础上再次应用UIEdgeInsets,相当于反复“拉伸”图片,自然就越来越大了。另外,默认的TabBarItem有固定尺寸限制,光调insets可能达不到你想要的放大效果。

一步步解决

1. 确保代码只跑一次

你已经把代码放在viewDidLoad里了,这很好——因为viewDidLoad只会在控制器初始化时执行一次。但要注意:绝对不要把这段逻辑放到viewWillAppear、tabBar(_:didSelect:)这类会重复调用的方法里,否则每次触发都会重复调整图片。

2. 用原始图片重新设置,避免叠加调整

别直接复用item.image,而是从资源文件直接加载原始图片,这样每次设置都是基于最原始的尺寸,不会出现叠加缩放的问题:

let titleTabrItems = ["Favourites","Calc","Time","Live","Shop"]
// 假设你的图标资源名称和标题对应,比如"FavouritesIcon"是未选中状态,"FavouritesIconSelected"是选中状态
let imageNames = ["FavouritesIcon", "CalcIcon", "TimeIcon", "LiveIcon", "ShopIcon"]
let selectedImageNames = ["FavouritesIconSelected", "CalcIconSelected", "TimeIconSelected", "LiveIconSelected", "ShopIconSelected"]

for (index, item) in (self.tabBar.items ?? []).enumerated() {
    // 设置标题(如果不需要显示,直接设为空字符串就行)
    item.title = index < titleTabrItems.count ? titleTabrItems[index] : ""
    
    // 直接加载原始图片,避免复用已经被调整过的item.image
    let normalImage = UIImage(named: imageNames[index])?.withRenderingMode(.alwaysOriginal)
    let selectedImage = UIImage(named: selectedImageNames[index])?.withRenderingMode(.alwaysOriginal)
    
    item.image = normalImage
    item.selectedImage = selectedImage
    
    // 如果你不需要显示标题,直接设空比偏移到10000更稳妥
    item.title = ""
    // item.titlePositionAdjustment = UIOffset(horizontal: 0, vertical: 10000)
    
    // 只设置一次insets,这个值是相对于原始图片的
    item.imageInsets = UIEdgeInsets(top: 0, left: -10, bottom: -6, right: -10)
}
self.navigationController?.setNavigationBarHidden(true, animated: false)

3. 调整TabBarItem的尺寸,容纳更大图标

默认的TabBarItem尺寸很小,要显示更大的图标,得先改tabBar.itemSize:

// 在viewDidLoad里加这行,设置你想要的item尺寸,比如宽60高60
self.tabBar.itemSize = CGSize(width: 60, height: 60)
// 如果想要自适应,可以用系统的自动尺寸配合自定义insets
// self.tabBar.itemSize = UITabBarItem.appearance().itemSize

4. 确认图片资源没问题

你已经按Apple的分辨率要求做了图(75px/3x、50px/2x、25px/1x),还要确保图片本身没有多余的空白边距——如果图标周围有空白,会导致显示出来的实际图标比你预期的小。

额外小提示

  • 如果还是出现缩放问题,检查下有没有其他地方(比如自定义TabBar子类、分类)偷偷修改了TabBarItem的imageInsets或itemSize;
  • 测试时可以打印item.image?.size和item.imageInsets,确认每次设置的都是原始尺寸和固定的insets值;
  • 隐藏标题直接设item.title = ""比偏移到10000更可靠,不会有奇怪的布局bug。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:28