如何创建影响所有或特定UIButton实例类型的全局函数?

时间:2018-07-18 23:56:09

标签: swift uibutton swift-extensions

我想创建一个全局函数,该函数会影响所有UIButton实例或仅影响某些UIButton类型的实例,这些实例会更新转角半径或border属性。我熟悉UIAppearances,但是我的客户希望拥有一个全局文件,他们可以在其中动态更新更改,就好像它是CSS样式表一样。到目前为止,我已经能够扩展UIColor和UIFont,这些扩展返回特定的颜色和字体,但是我不知道这对于UIButton实例如何工作。到目前为止,这是我一直想的,但是我认为这不起作用:

@objc extension UIButton {

    func changeUIButtonBorder() -> UIButton {
        self.layer.borderWidth = 3
        self.layer.borderColor = UIColor.white.cgColor
        return self
    }

}

1 个答案:

答案 0 :(得分:2)

您正在做的事情很棒,并且确实适用于UIButton实例。但是没有必要返回。在扩展名中,self 按钮。这样它就可以改变自己。

@objc extension UIButton {
    func changeUIButtonBorder() {
        self.layer.borderWidth = 3
        self.layer.borderColor = UIColor.white.cgColor
    }
}

您现在可以在任何 UIButton实例上调用changeUIButtonBorder

@IBOutlet var myButton : UIButton!
override func viewDidLoad() {
    super.viewDidLoad()
    myButton.changeUIButtonBorder()
}

但是,没有一种神奇的方法可以向所有应该调用该方法的UIButton喊叫;您将不得不一次与他们打交道。

正如@Sh_Khan建议的那样,“神奇”方式是使UIButton子类在其自己的初始化程序中调用changeUIButtonBorder 。然后,您只需要确保所有按钮都是该子类的实例即可。

例如,这是一个始终为红色的UIButton子类(假设所有实例都来自情节提要):

class RedButton : UIButton {
    override func awakeFromNib() {
        super.awakeFromNib()
        self.backgroundColor = .red
    }
}