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

Posted

技术标签:

【中文标题】将自定义 UIButton 样式应用于所有按钮【英文标题】:Apply custom UIButton styling to all Buttons 【发布时间】:2017-09-16 17:32:00 【问题描述】:

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

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

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

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

【问题讨论】:

检查UIAppearance 为什么不创建一个包含所有这些样式属性的UIButton 的子类,并让所有按钮使用该子类而不是UIButton @Lamar 谢谢,这将是最好的解决方案。 不客气 【参考方案1】:

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

比如UIButton

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

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

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
      


【讨论】:

@lamar : 感谢您重构代码 :) 非常感谢【参考方案2】:

您可以使用 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 的更多信息

【讨论】:

【参考方案3】:

您可以使用 IBInspectable 创建自定义类。所以你可以从 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()
    


【讨论】:

不错的解决方案。但是请记住,一旦您的项目变得庞大,IBInspectable 就会有点混乱且不可靠。我们不得不在一个大型项目中从 IB 中删除所有这些东西,因为它会导致长时间的编译和粉丝疯狂地旋转。【参考方案4】:

您可以定义一个类并将其设置为您的按钮并在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
    

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

【讨论】:

【参考方案5】:

使用 UIButton api a 来保存按钮样式,然后使所有按钮都符合它。

【讨论】:

以上是关于将自定义 UIButton 样式应用于所有按钮的主要内容,如果未能解决你的问题,请参考以下文章

后台文章编辑器的可视区域添加自定义功能按钮

php Wordpress管理样式 - 将自定义CSS应用于管理区域

将自定义文本添加到 iPhone sdk 中的 uibutton

如何将自定义按钮应用于 Android Studio 中的活动?

UIButton 图层样式使应用程序变慢

将自定义参数传递给 uibutton #selector swift 3