SwiftUI TabBar Item设置用户头像为图片无法按指定尺寸缩小问题
问题原因
SwiftUI 的 tabItem 闭包中的视图修饰符会被系统默认渲染规则覆盖,你设置的 frame、resizable 等尺寸控制修饰符均不会生效,系统会按照默认的TabBarItem图片尺寸规则渲染你传入的原图,才会出现尺寸远大于预期的问题。
解决方法
直接提前将原图缩放为你需要的20x20尺寸,再传入 Image 初始化即可,步骤如下:
- 第一步:添加UIImage扩展实现图片缩放能力
extension UIImage { /// 将图片缩放到指定尺寸 func scaled(to targetSize: CGSize) -> UIImage { let scale = UIScreen.main.scale // 按屏幕倍率生成高清缩放图,避免模糊 let renderSize = CGSize(width: targetSize.width * scale, height: targetSize.height * scale) UIGraphicsBeginImageContextWithOptions(renderSize, false, scale) defer { UIGraphicsEndImageContext() } draw(in: CGRect(origin: .zero, size: renderSize)) return UIGraphicsGetImageFromCurrentImageContext() ?? self } }
- 第二步:修改你的tabItem实现,使用缩放后的图片
ProfileView() .tag(3) .tabItem { if selectedTab == 3 { if let originImg = UIImage(named: "1024") { let scaledImg = originImg.scaled(to: CGSize(width: 20, height: 20)) Image(uiImage: scaledImg) // 如果要保留头像原始色彩,加这行避免被TabBar tint染色 .renderingMode(.original) } } else { Image(systemName: "bell") } }
如果需要实现圆形头像效果,只需要在缩放图片的逻辑中增加圆角裁剪的代码即可,不需要在tabItem中加cornerRadius修饰符,该修饰符同样会被系统忽略。
内容的提问来源于stack exchange,提问作者SwiftyJason
相关产品推荐
相关产品推荐

