我一直在设置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的颜色,但设置图像确实有效> _>
答案 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
必须将背景颜色设置回默认值。