SwiftUI中UIImage颜色修改失效问题求助
SwiftUI修改SF Symbols图片颜色失效的解决办法
问题根源
你现在的代码是把SF Symbols转成UIImage后再用Image(uiImage:)展示,一旦转成UIImage,它就变成了位图文件,不再是矢量符号。而.foregroundColor()修饰符只对矢量的SF Symbols或可渲染的矢量图起作用,所以自然改不了颜色。
两种解决思路
思路1:直接用SwiftUI原生渲染SF Symbols(最推荐)
别再转UIImage了,直接用SwiftUI自带的Image(systemName:)初始化,然后通过.font()或者.scaleEffect()调整尺寸,这样就能正常用.foregroundColor()改颜色:
Image(systemName: isLiked ? "heart.fill" : "heart") .font(.system(size: 27)) // 直接设置字体大小控制图标尺寸 .foregroundColor(isLiked ? (colorPalettes[safe: sharedVars.colorPaletteIndex]?[2] ?? .white) : .gray)
如果需要精确匹配75x27的尺寸,可以结合.scaleEffect()和.frame():
Image(systemName: isLiked ? "heart.fill" : "heart") .scaleEffect(1.8) // 根据需求调整缩放比例 .frame(width: 75, height: 27) .foregroundColor(isLiked ? (colorPalettes[safe: sharedVars.colorPaletteIndex]?[2] ?? .white) : .gray)
思路2:给UIImage提前着色(保留原有逻辑时用)
如果必须保留转UIImage的流程,那就在生成UIImage的时候直接给它加上颜色,不要依赖SwiftUI的修饰符:
func generateColoredSymbol(named: String, color: UIColor, targetSize: CGSize) -> UIImage? { guard let baseImage = UIImage(systemName: named)?.withTintColor(color, renderingMode: .alwaysOriginal) else { return nil } let renderer = UIGraphicsImageRenderer(size: targetSize) return renderer.image { context in baseImage.draw(in: CGRect(origin: .zero, size: targetSize)) } } // 调用示例 Image(uiImage: generateColoredSymbol( named: isLiked ? "heart.fill" : "heart", color: isLiked ? UIColor(colorPalettes[safe: sharedVars.colorPaletteIndex]?[2] ?? .white) : .gray, targetSize: CGSize(width: 75, height: 27))! )
预期效果
用第一种思路的话,未点赞时心形是灰色轮廓,点击后会填充成你指定的调色板颜色,和旁边的点赞数字颜色完全统一。
内容的提问来源于stack exchange,提问作者Daggerpov
相关产品推荐
相关产品推荐

