微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – Swift UIButton子类并根据变量更改颜色

我正在为我的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
    }
}
}

解决方法

您的isActive属性写得不正确.它首先不应该是计算属性.目前,getter只会导致无限递归,而setter实际上并没有设置任何东西.

isActive属性应该是带有didSet属性observer的存储属性

@IBInspectable
var isActive: Bool {
    didSet {

    }
}

在didSet中,你可以放下commonInit的最后一部分.每次isActive更改时都不需要运行commonInit的第一部分.我建议你将其解压缩为一个名为updateBorder的方法

func updateBorder(isActive: Bool) {

    if (isActive) {
        self.tintColor = ACTIVE_COLOR
        self.layer.borderColor = ACTIVE_COLOR.cgColor
    } else {
        self.tintColor = nil
        self.layer.borderColor = UIColor(red:0.69,alpha:1.0).cgColor
    }

}

然后在didSet中,您可以调用它:

updateBorder(isActive: isActive)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐