自定义UIButton的.disabled状态下setTitleColor不生效,求排查方案
问题分析与修复方案
核心问题排查
- 参数传递错误:你在
configFilledButton方法里调用setTitleColor(color, for: .disabled)时,错误地把背景色参数color传给了禁用态的文本颜色,而不是传入的textColor,这直接导致禁用态文本颜色变成了背景色,和你预期的浅灰色不符。 - 直接修改
titleLabel.textColor无效:UIButton的文本颜色是按状态(enabled、disabled等)管理的,直接设置self.titleLabel?.textColor会被UIButton内部的状态样式逻辑覆盖,完全没必要这么写,统一用setTitleColor(_:for:)对应不同状态设置即可。 - 状态切换逻辑不完整:你的
toggleEnabledState方法只处理了禁用的情况,没做恢复启用的逻辑,而且没有设置按钮的isEnabled属性——光改样式但不同步按钮状态,后续可能引发交互逻辑异常。
修正后的完整代码
class CustomButton: UIButton { // 配置填充样式按钮 // 默认文本颜色为白色 func configFilledButton(color: UIColor, textColor: UIColor? = .white) { // 给正常启用状态设置文本颜色 setTitleColor(textColor, for: .normal) // 给禁用状态单独设置浅灰色文本 setTitleColor(UIColor(named: K.BrandColors.greyLight), for: .disabled) backgroundColor = color } // 切换按钮启用/禁用状态 func toggleEnabledState(isEnabled: Bool) { self.isEnabled = isEnabled // 必须同步设置按钮的交互状态 if !isEnabled { let disabledBgColor = UIColor(named: K.BrandColors.greyMedium)! configFilledButton(color: disabledBgColor) } else { // 补充恢复启用状态时的样式,替换成你实际的启用态背景色 let enabledBgColor = UIColor(named: K.BrandColors.yourEnabledThemeColor)! configFilledButton(color: enabledBgColor) } } }
额外说明
如果需要让禁用态的文本色和正常态参数分离,可以给configFilledButton新增一个disabledTextColor参数,比如:
func configFilledButton(color: UIColor, textColor: UIColor? = .white, disabledTextColor: UIColor? = .lightGray) { setTitleColor(textColor, for: .normal) setTitleColor(disabledTextColor, for: .disabled) backgroundColor = color }
内容的提问来源于stack exchange,提问作者Farquad
相关产品推荐
相关产品推荐

