Button为enabled=false状态时如何获取其默认背景色和文本色

以下针对iOS平台的UIButton给出通用解决方案:
文本色获取(全系统版本通用)
直接调用UIButton的内置状态查询方法即可,无需额外处理:
let disabledTitleColor = button.titleColor(for: .disabled)
如果是自定义按钮单独设置了富文本标题,可通过attributedTitle(for: .disabled)读取对应富文本中的颜色属性。
背景色获取
分两种情况处理:
1. 自定义过按钮不同状态的背景
如果提前通过setBackgroundImage(_:for:)等方法为.disabled状态单独设置了背景,直接调用对应读取方法即可:
let disabledBgImage = button.backgroundImage(for: .disabled)
你也可以直接将颜色生成背景图设置给对应状态,后续读取时可反向解析出颜色值。
2. 未自定义的系统默认按钮
系统默认样式的UIButton没有直接暴露禁用状态的背景色属性,可通过实时渲染视图的方式获取当前实际显示的背景色:
// 先将按钮切换到禁用状态 button.isEnabled = false // 渲染按钮当前状态为图片 UIGraphicsBeginImageContextWithOptions(button.bounds.size, false, UIScreen.main.scale) guard let context = UIGraphicsGetCurrentContext() else { return } button.layer.render(in: context) let renderImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // 读取按钮中心位置的像素色,即为禁用状态的背景色 let disabledBgColor = renderImage?.getPixelColor(at: CGPoint(x: button.bounds.midX, y: button.bounds.midY))
附:UIImage读取像素色的常见扩展实现:
extension UIImage { func getPixelColor(at point: CGPoint) -> UIColor? { guard let cgImage = cgImage, let dataProvider = cgImage.dataProvider, let pixelData = dataProvider.data else { return nil } let data = CFDataGetBytePtr(pixelData) let pixelInfo = Int((size.width * point.y + point.x)) * 4 let red = CGFloat(data?[pixelInfo] ?? 0) / 255.0 let green = CGFloat(data?[pixelInfo + 1] ?? 0) / 255.0 let blue = CGFloat(data?[pixelInfo + 2] ?? 0) / 255.0 let alpha = CGFloat(data?[pixelInfo + 3] ?? 0) / 255.0 return UIColor(red: red, green: green, blue: blue, alpha: alpha) } }
iOS 15+ 使用UIButton.Configuration的情况
如果你的项目适配最低版本为iOS 15,使用了新增的Configuration样式配置按钮,可直接从配置中读取对应状态的颜色属性:
guard let config = button.configuration else { return } let disabledTitleColor = config.titleTextAttributesTransformer?.transform(.init()).foregroundColor let disabledBgColor = config.background.backgroundColorTransformer?.transform(.init(for: .disabled))
内容的提问来源于stack exchange,提问作者Abdulsamet Kılınçarslan
相关产品推荐
相关产品推荐

