【发布时间】:2018-11-29 06:22:24
【问题描述】:
我正在为我的 UIButton 使用一个子类,它有一个名为 isActive 的变量。我需要根据该变量更改按钮边框颜色。此变量将以编程方式更改。请帮我解决这个问题。
@IBDesignable
class buttonCTAOutlineDark: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override func prepareForInterfaceBuilder() {
commonInit()
}
@IBInspectable var isActive: Bool {
get {
return self.isActive
}
set (active) {
if active {
commonInit(isActive: active)
}
}
}
func commonInit(isActive: Bool = false) {
self.backgroundColor = .clear
self.layer.cornerRadius = 4
self.layer.borderWidth = 1
if (isActive) {
self.tintColor = ACTIVE_COLOR
self.layer.borderColor = ACTIVE_COLOR.cgColor
} else {
self.tintColor = nil
self.layer.borderColor = UIColor(red:0.69, green:0.72, blue:0.77, alpha:1.0).cgColor
}
}
}
【问题讨论】:
-
使用属性观察者 didSet、willSet。每当您更新属性值时,这些方法都会调用。看看吧nshipster.com/swift-property-observers
-
@hashHb
get {return self.isActive}将被递归调用。因此,请尝试{return isActive}。同样在set (active)中,只有当active为真时才会调用commonInit方法。所以你可以试试set (active) { isActive = active;commonInit(isActive: active)} -
就我个人而言,我根本不建议使用这些属性观察器,因为调用者不清楚属性更改可能会产生什么副作用。我只是为它创建一个方法,这样调用者就更清楚事情可以改变了。
标签: ios swift uibutton subclass programmatically