iOS14.0.1下动态修改UITabBarItem图片遇问题求解决方案
解决UITabBarItem动态修改图片的尺寸与颜色问题
针对你在iOS14.0.1、Swift5.3、Xcode12.0.1环境下遇到的两个问题,我给你整理了具体的解决方案:
问题一:图片尺寸过大
UITabBarItem有固定的图标尺寸规范(iOS标准是24x24pt左右),直接赋值原图会因为没有适配这个尺寸导致显示过大。你可以通过两种方式解决:
方式1:缩放图片到标准尺寸
写一个UIImage的扩展方法,把原图缩放到TabBar图标要求的大小:
extension UIImage { func scaledToTabBarSize() -> UIImage? { // TabBar图标标准尺寸:24x24pt,可根据需求微调 let targetSize = CGSize(width: 24, height: 24) UIGraphicsBeginImageContextWithOptions(targetSize, false, UIScreen.main.scale) defer { UIGraphicsEndImageContext() } draw(in: CGRect(origin: .zero, size: targetSize)) return UIGraphicsGetImageFromCurrentImageContext() } }
方式2:调整图片内边距(临时应急用)
如果不想缩放图片,可以通过设置imageInsets压缩显示空间,但这种方式可能会让图片变形,优先推荐方式1:
self.tabBarCtrl?.viewControllers?[2].tabBarItem.imageInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
问题二:图片颜色错误
这是因为UITabBarItem默认会把图片渲染成系统的tintColor(比如蓝色),覆盖了图片本身的颜色。只要把图片的渲染模式设置为.alwaysOriginal,就能保留原图的颜色:
整合尺寸与颜色的完整代码
把两个问题的解决逻辑结合起来,最终代码如下:
// 获取原图并处理 if let originalImage = #imageLiteral(resourceName: "Sign_ready"), let tabBarImage = originalImage.scaledToTabBarSize()?.withRenderingMode(.alwaysOriginal) { // 同时设置普通状态和选中状态的图片 let tabBarItem = self.tabBarCtrl?.viewControllers?[2].tabBarItem tabBarItem?.image = tabBarImage tabBarItem?.selectedImage = tabBarImage }
额外说明:如果用了UITabBarAppearance
如果你在iOS14中配置了UITabBarAppearance,要确保外观设置不会影响图片的颜色渲染:
let tabBarAppearance = UITabBarAppearance() // 如果需要自定义选中/未选中的图标颜色,确保图片用了.alwaysOriginal才会生效 tabBarAppearance.stackedLayoutAppearance.normal.iconColor = .gray tabBarAppearance.stackedLayoutAppearance.selected.iconColor = .black self.tabBarCtrl?.tabBar.standardAppearance = tabBarAppearance
这样修改后,你的TabBarItem图片就能正常显示正确的尺寸和颜色啦!
内容的提问来源于stack exchange,提问作者iKK
相关产品推荐
相关产品推荐

