iOS按钮adjustsImageWhenDisabled废弃:求简便替代方案及相关疑问
关于
adjustsImageWhenDisabled废弃后的替代方案及相关疑问解答 一、adjustsImageWhenDisabled废弃后的简便替代
原来的adjustsImageWhenDisabled = false确实简洁高效,但既然被官方废弃,最贴合原逻辑的替代方式是直接给禁用状态设置和正常状态完全一致的图片,不需要复杂的状态监听。
你用UIGraphicsBeginImageContext生成纯色图的场景下,只需要把同一张图同时设置给.normal和.disabled状态,系统就不会自动给禁用态的图片加暗化效果了,代码示例:
// 生成你的纯色背景图 let solidColorImage = UIGraphicsImageRenderer(size: CGSize(width: 44, height: 44)).image { context in UIColor.yourTargetColor.setFill() context.fill(CGRect(origin: .zero, size: CGSize(width: 44, height: 44))) } // 同时给正常态和禁用态设置同一张图 button.setBackgroundImage(solidColorImage, for: .normal) button.setBackgroundImage(solidColorImage, for: .disabled)
这个方案和你原来的adjustsImageWhenDisabled = false逻辑完全一致,而且更符合当前UIKit的设计规范。
你现在用重写isEnabled的didSet来切换背景色和背景图的方案也能实现需求,但相对繁琐,没必要多写状态监听的代码。
二、为什么直接用setBackgroundImage(for:.disabled)没生效?
常见原因有这几个:
- 按钮类型冲突:如果你的按钮是默认的
UIButtonType.system,系统自带的禁用态样式会覆盖你设置的背景图。改成.custom类型就能解决:let button = UIButton(type: .custom) - 图片渲染模式问题:用
UIGraphicsBeginImageContext生成的图默认是automatic渲染模式,系统会对禁用态的图自动做色调调整。把图片改成.alwaysOriginal渲染模式即可:let disabledImage = solidColorImage.withRenderingMode(.alwaysOriginal) button.setBackgroundImage(disabledImage, for: .disabled) - 状态优先级问题:如果按钮同时存在
.disabled+.highlighted这类组合状态,你只设置单纯的.disabled状态图是不会触发的,需要针对性设置组合状态的图(不过这种场景比较少见)。
内容的提问来源于stack exchange,提问作者Siamaster
相关产品推荐
相关产品推荐

