如何改用UIButton.Configuration重构UIButton并保持原有效果?
直接上与原代码行为完全匹配的重构代码,再逐点对应说明:
let button = UIButton(configuration: .plain()) button.addTarget(self, action: #selector(buttonPressed(_:)), for: .touchUpInside) // 提取并修改按钮配置 var config = button.configuration config?.image = UIImage(named: "MyIcon") config?.imageContentMode = .scaleAspectFit config?.imageInsets = NSDirectionalEdgeInsets(top: -8, leading: -40, bottom: -8, trailing: 0) config?.titleInsets = NSDirectionalEdgeInsets(top: 0, leading: -60, bottom: 0, trailing: 0) button.configuration = config button.translatesAutoresizingMaskIntoConstraints = false button.sizeToFit()
关键配置对应说明
- 按钮初始化:用
UIButton(configuration: .plain())替代空初始化,plain样式对应原按钮的基础无装饰外观,是最贴近原有实现的Configuration样式。 - 事件绑定:
addTarget逻辑完全保留,Configuration范式不处理交互事件绑定,仍沿用原有API。 - 图片设置:
config?.image对应原代码的setImage(_:for: .normal),Configuration默认会将图片应用到.normal状态;若需多状态图片,可使用config?.setImage(UIImage(named: "HighlightedIcon"), for: .highlighted)补充配置。 - 图片缩放模式:
config?.imageContentMode直接替代原代码的button.imageView?.contentMode,无需直接访问底层imageView,更符合Configuration的封装逻辑。 - 内边距适配:用
NSDirectionalEdgeInsets替代原有的UIEdgeInsets,适配RTL布局,数值完全对应原代码的top/left/bottom/right,仅将left改为leading、right改为trailing,确保视觉偏移完全一致。 - 布局与尺寸:
translatesAutoresizingMaskIntoConstraints = false和sizeToFit()逻辑完全保留,与原代码行为一致。
如果需要扩展高亮、选中等其他状态的样式,直接在config上追加对应状态的配置即可,无需重复设置基础属性,这也是Configuration范式的优势之一。
内容的提问来源于stack exchange,提问作者Ajvar1
相关产品推荐
相关产品推荐

