更改自定义UIButton的背景颜色?

时间:2017-11-16 05:28:51

标签: ios swift uibutton

我一直在设置self.layer.backgroundColor = someColor按钮的backgroundColor。

但是,这似乎不适用于自定义类?我有这个通用课程:

class DarkButton: BaseButton {
    override func layoutSubviews() {
        super.layoutSubviews()

        self.layer.cornerRadius = 5
        self.setTitleColor(UIColor.black, for: .normal)
        self.setTitleColor(UIColor.lightGray, for: .highlighted)
        self.layer.backgroundColor = UIColor(red:0.77, green:0.77,
                                             blue:0.77, alpha: 1.0).cgColor
        self.clipsToBounds = false
    }

}

self.layer.backgroundColor工作得很好。现在如果我扩展它,就像这样:

class SuperCoolButton: DarkButton {

    required init() {
        super.init()
        self.setUp()
    }

    required init(spacing: Spacing) {
        super.init(spacing: spacing)
        self.setUp()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.setUp()
    }

    func setUp() {
        self.generateImage()
        self.changeBGColor()
    }

    func generateImage() {
        let image = UIImage(named: "logoSmall") as UIImage?
        self.setImage(image, for: .normal)
        self.imageEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0)
        self.imageView?.contentMode = .scaleAspectFit
    }

    func changeBGColor() {
        self.layer.backgroundColor = UIColor.red.cgColor
    }

}

backgroundColor保留DarkButton backgroundColor的颜色,但设置图像确实有效> _>

2 个答案:

答案 0 :(得分:3)

请勿在{{1​​}}中调用setUp()方法,而不是在init

中调用此方法
layoutSubviews

答案 1 :(得分:3)

这种情况正在发生,因为超级类(DarkButton)中实现的layoutSubviews()setUp DarkButton方法之后被调用。您需要覆盖类SuperCoolButton中的layoutSubviews并在其中调用setUp而不是其init方法。

override func layoutSubviews() {
        super.layoutSubviews()
        setUp()
}

修改: 我认为你应该移动你在[layoutSubviews][1]类的DarkButton内编写的代码。

layoutSubviews方法被多次调用,只有与视图布局相关的代码应该在那里。

  

子类可以根据需要覆盖此方法以执行更精确的操作   他们的子视图的布局。你应该只在这个时候覆盖这个方法   子视图的自动调整和基于约束的行为不会   提供你想要的行为。

更改图层的圆角半径和setTitleColor或背景颜色的理想位置是在自定义视图的初始位置或awakeFromNib :(仅限,如果视图始终采用笔尖设计)。

因为您想稍后更改按钮的背景颜色。您只需在SuperCoolButton上调用changeBgColor方法即可。之前它没有用,因为layoutSubviews必须将背景颜色设置回默认值。