Swift中如何修改ImageView颜色?图标颜色修改失败求助
解决Swift中UIImageView图标颜色无法修改的问题
嘿,我一眼就看到问题所在啦——你在active方法里调用了withTintColor,但没把返回的新UIImage赋值给imageView.image!因为withTintColor是返回一个新的带颜色的图片对象,不会修改原对象,所以你的图标颜色根本没更新。
修正后的核心代码
先把你的active方法改成这样:
@objc func active(textField: UITextField) { animateLine(show: true) if #available(iOS 13.0, *) { // *关键步骤:*将新生成的红色图片赋值给imageView的image属性 guard let redColor = UIColor(named: "red") else { print("找不到名为red的颜色,请检查Assets目录") return } imageView.image = imageView.image?.withTintColor(redColor, renderingMode: .alwaysOriginal) } else { // iOS13之前直接用tintColor属性即可 imageView.tintColor = UIColor(named: "red") } }
额外优化小技巧
- 避免强制解包:用
guard let或者if let处理UIColor(named:),防止因为颜色名拼写错误导致崩溃,还能加个打印日志方便排查问题。 - 简化初始化代码:其实对于SF Symbols,你不用每次都生成新图片,直接修改
imageView.tintColor更简洁:
初始化时可以改成:
// 初始化图标 if let iconImg = UIImage(systemName: iconName) { imageView.image = iconImg imageView.tintColor = UIColor(named: "blue") // 直接设置初始 tint 颜色 imageView.contentMode = .scaleAspectFit } // ... 添加到view的代码不变
然后修改颜色时直接改tintColor就行,不用再生成新图片:
@objc func active(textField: UITextField) { animateLine(show: true) imageView.tintColor = UIColor(named: "red") }
这样代码更清爽,还避免了重复创建UIImage实例的开销。
- 恢复颜色的逻辑:如果需要在输入框失去焦点时变回蓝色,可以再加一个对应的方法:
@objc func inactive(textField: UITextField) { animateLine(show: false) imageView.tintColor = UIColor(named: "blue") }
记得把这个方法绑定到输入框的editingDidEnd事件上哦。
内容的提问来源于stack exchange,提问作者test testing
相关产品推荐
相关产品推荐

