UIImage与UIImageView的tint有何区别?该如何选择?
两种设置图片 Tint 颜色方式的区别与选择建议
先看你写的代码:
var itemIconImage = UIImage(cgImage: item.image) if item.shouldOverlay { itemIconImage = itemIconImage.withTintColor(.black, renderingMode: .alwaysOriginal) } itemIcon = UIImageView(image: itemIconImage)
你提到的两种设置tint颜色的方式,核心区别和适用场景如下:
一、核心区别
1. 作用对象不同
UIImage.withTintColor(_:renderingMode:):直接修改UIImage实例,生成一个全新的带tint色的图片对象,原图片不会被修改。UIImageView.tintColor:修改图片视图的属性,仅作用于当前视图的显示效果,底层的UIImage对象完全不变。
2. 灵活性与修改成本
- 用
withTintColor生成的图片,tint色是“固化”在图片里的,后续要改颜色必须重新生成新的UIImage对象。 - 用
UIImageView.tintColor的话,随时修改视图的该属性,图片就能实时更新显示效果,不需要重新创建图片,调整成本更低。
3. 渲染模式的约束
withTintColor可以指定renderingMode:比如你代码里的.alwaysOriginal,会让这个图片后续无论放在哪个UIImageView里,都保持当前设置的tint色,不受视图tintColor影响;如果设为.alwaysTemplate,则这个图片会继承所在视图的tintColor。UIImageView.tintColor生效的前提是:图片的渲染模式是.alwaysTemplate(或默认的.automatic且图片支持模板化)。如果图片是.alwaysOriginal模式,修改视图的tintColor完全没用。
二、该选哪一种?
- 选
UIImage.withTintColor的场景:需要固定tint色的图片,且这个图片会被多个视图复用,或者后续不需要调整颜色。比如一些静态的装饰图标,颜色固定不变。 - 选
UIImageView.tintColor的场景:需要动态调整颜色的情况,比如主题切换、按钮点击高亮变色等。这种方式不用重复创建图片,性能更好,调整也更灵活。
额外提醒:如果想用UIImageView.tintColor改色,先确保图片的渲染模式是.alwaysTemplate,比如可以这么处理:
let templateImage = UIImage(cgImage: item.image).withRenderingMode(.alwaysTemplate) itemIcon = UIImageView(image: templateImage) itemIcon.tintColor = .black
内容的提问来源于stack exchange,提问作者OMGPOP
相关产品推荐
相关产品推荐

