将自定义 UIButton 样式应用于所有按钮

Apply custom UIButton styling to all Buttons

我想对来自多个故事板的所有 viewcontroller 应用一些样式。我有很多 viewcontroller,因此将样式应用于每个 viewcontroller 听起来很愚蠢。我想尽可能以最精益代码的方式来做这件事。我想在 AppDelegate 文件中执行此操作,因为您也可以在那里更改导航控制器样式,但到目前为止没有成功。甚至没有丝毫的方式。

那么有人知道我该怎么做吗?

我正在为该应用程序使用 Swift。

必须应用以下样式原则: cornerRadius, shadowColor, shadowOffset, shadowRadius, shadowOpacity, maskToBounds.

UIComponents 创建您想要添加通用样式的扩展。

UIButton

extension UIButton {
    open override func draw(_ rect: CGRect) {
        //provide custom style
        self.layer.cornerRadius = 10 
        self.layer.masksToBounds = true
    }
}

或者创建 UIButton 的子class 并提供您想要应用的所有样式并确保您的按钮从您的自定义 class

延伸
class MyButton : UIButton {

   override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
      }

   required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
      }

   private func setup() {
        self.layer.cornerRadius = 10
        self.layer.masksToBounds = true
      }

}

您可以使用 UIAppearance api,像这样:

UIButton.appearance().layer.cornerRadius = 4
UIButton.appearance().layer.shadowColor = UIColor.white.cgColor
UIButton.appearance().layer.shadowOffset = CGSize(width: 2, height: 2)
UIButton.appearance().layer.shadowRadius = 5
UIButton.appearance().layer.shadowOpacity = 0.5
UIButton.appearance().layer.masksToBounds = true

通过使用它,您应用程序上的每个 UIButton 都会将这些视觉属性设置为您定义的内容。

您可以在 https://developer.apple.com/documentation/uikit/uiappearance

找到有关此 API 的更多信息

使用 UIButton api 将保留按钮样式,然后使所有按钮都符合它。

您可以使用 IBInspectable 进行自定义 class。所以你可以从 UI.====>

class NSCustomButton: UIButton {

    @IBInspectable var borderColor: UIColor = UIColor.clear {
        didSet {
            layer.borderColor = borderColor.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0 {
        didSet {
            layer.cornerRadius = cornerRadius
            self.clipsToBounds = true
            self.layer.masksToBounds = true
        }
    }

    @IBInspectable var cornerRadiusByHeight: Bool = false {
        didSet {
            layer.cornerRadius = self.frame.size.height/2
        }
    }

    @IBInspectable var roundButton: Bool = false {
        didSet {
            layer.cornerRadius = self.frame.size.width / 2
            self.clipsToBounds = true
            self.layer.masksToBounds = true
        }
    }


    @IBInspectable var shadowColor: UIColor = UIColor.clear {

        didSet {

            layer.shadowColor = shadowColor.cgColor
            layer.masksToBounds = false
        }
    }


    @IBInspectable var shadowOpacity: CGFloat = 0.0 {

        didSet {

            layer.shadowOpacity = Float(shadowOpacity.hashValue)
            layer.masksToBounds = false
        }
    }

    @IBInspectable var shadowRadius: CGFloat = 0.0 {

        didSet {

            layer.shadowOpacity = Float(shadowRadius.hashValue)
            layer.masksToBounds = false
        }
    }

    override internal func awakeFromNib() {
        super.awakeFromNib()
    }

}

您可以定义一个 class 并将其设置为您的按钮并在 awakeFromNib() 方法中配置它。

@IBOutlet weak var myButton: MyCustomButton!


class MyCustomButton : UIButton{
    override func awakeFromNib() {
        super.awakeFromNib()
        setTitleColor(UIColor.black, for: .normal)
        layer.cornerRadius = 6
        backgroundColor = UIColor.red
        layer.borderWidth = 0.5
        layer.borderColor = UIColor.VFGGray.cgColor
    }
}

这样您所有的按钮都会有相同的外观。 希望对你有帮助