求助:修改UIButton.disabled状态下的图片颜色,按钮始终呈灰色
你已经走对了方向——用alwaysTemplate模式让图片继承tint颜色,但按钮还是显示灰色,大概率是系统默认的禁用状态 tint 覆盖了你的自定义设置,或者设置方式不对。这里给你几个针对性的修复方案:
1. 针对禁用状态单独设置tintColor
直接设置按钮的全局tintColor会被系统在禁用状态下自动替换成灰色,你需要明确指定禁用状态的tint值:
sendCodeBtn.isEnabled = false // 给禁用状态的图片开启模板模式 sendCodeBtn.setImage(#imageLiteral(resourceName: "validated_phone").withRenderingMode(.alwaysTemplate), for: .disabled) // 单独为禁用状态设置自定义tint颜色 sendCodeBtn.setTintColor(Theme.defaultColor(), for: .disabled)
这个方法会覆盖系统默认的禁用态灰色,强制使用你指定的颜色。
2. 排查图片的模板兼容性
确保你的validated_phone图片是适合作为模板使用的:比如是单色的(比如白色或透明底的黑色图标),如果图片本身带有多色或复杂背景,alwaysTemplate模式可能无法正确渲染出你想要的tint效果。建议用矢量图或者纯单色的PNG图。
3. 检查是否有其他样式冲突
如果你的按钮用了iOS 15+的UIButton.Configuration,或者是自定义子类,可能有其他配置优先级更高:
- 用Configuration的话,需要设置禁用状态的前景色:
var config = sendCodeBtn.configuration ?? .plain() config.disabledForegroundColor = Theme.defaultColor() sendCodeBtn.configuration = config
另外也检查一下Storyboard/XIB里的按钮设置,是否有勾选了“Disable Tint”之类的选项,或者设置了固定的禁用态图片。
4. 确认按钮状态是否正确
你提到“按钮也会处于启用状态,但目前按钮始终显示为灰色”,可以在设置完isEnabled后打印一下sendCodeBtn.isEnabled,看看按钮实际是否真的处于启用状态——会不会有其他代码逻辑意外把它设回了禁用?
试试上面的方案,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Mohamed Lee




