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

How to create a global function that affects all or specific UIButton instance types?

我想创建一个全局函数,它影响所有 UIButton 实例或仅影响特定 UIButton 类型的实例,这将更新角半径或边框 属性。我熟悉 UIAppearances,但是我的客户想要一个全局文件,他们可以在其中动态更新更改,就好像它是 CSS 样式表一样。到目前为止,我已经能够对 returns 特定颜色和字体的 UIColor 和 UIFont 进行扩展,但是我无法弄清楚这对于 UIButton 实例是如何工作的。到目前为止,这是我的想法,但我认为这行不通:

@objc extension UIButton {

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

}

您所做的很棒,确实适用于 UIButton 实例。但是不需要 return 任何东西。在扩展中,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 广播他们应该调用该方法;你必须一次处理一个。

"magical" 方法是,正如@Sh_Khan 所建议的那样,创建一个 UIButton 子类,该子类在其自己的初始化程序 中调用changeUIButtonBorder 。然后,您只需确保所有按钮都是该子类的实例。

例如,这里有一个始终为红色的 UIButton 子类(假设所有实例都来自故事板):

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