我正在为我的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 举报,一经查实,本站将立刻删除。