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
相关产品推荐
相关产品推荐

