自定义UIButton:如何在选中状态变化时设置背景色?
嘿,这个问题我碰到过好多次,咱们一步步拆解解决:
首先你的断点没触发,说明isSelected的didSet压根没被调用——大概率是两个核心原因:
1. 没有主动触发isSelected状态切换
UIButton默认不会自动切换选中状态,你得手动去设置它!比如得给按钮加点击事件,在事件里切换isSelected的值,不然这个属性永远是默认的false,didSet自然不会触发。
2. 系统按钮样式覆盖了背景色
如果你的按钮用的是默认的System样式,iOS会用内置样式管理选中/高亮状态,你的backgroundColor设置会被系统覆盖,哪怕isSelected变了,背景色也不会按你的逻辑走。
修正后的完整代码
我把这两个问题都处理了,给你调整后的代码:
class MyCustomButton: UIButton { // 初始化时统一配置 override init(frame: CGRect) { super.init(frame: frame) setupButton() } required init?(coder: NSCoder) { super.init(coder: coder) setupButton() } private func setupButton() { // 切换为Custom类型,避免系统样式干扰 self.buttonType = .custom // 设置初始背景色 backgroundColor = .white // 添加点击事件,手动切换选中状态 addTarget(self, action: #selector(toggleSelection), for: .touchUpInside) } @objc private func toggleSelection() { // 点击时切换选中状态 isSelected = !isSelected } override var isSelected: Bool { didSet { // 现在这个断点应该能正常触发了 backgroundColor = isSelected ? .red : .white } } }
额外注意事项
- 如果你用Storyboard/XIB创建按钮:
- 在Identity Inspector里把按钮的Class改成
MyCustomButton - 在Attributes Inspector里把Button Style改成
Custom(别用System)
- 在Identity Inspector里把按钮的Class改成
- 检查其他代码有没有地方修改这个按钮的
backgroundColor,如果有,会覆盖你在didSet里的设置。
这样调整后,点击按钮就能看到背景色在红/白之间正常切换啦!
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

