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

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

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

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

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

【问题讨论】:

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

标签: ios swift uibutton appdelegate


【解决方案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 来保存按钮样式,然后使所有按钮都符合它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        • 2015-10-04
        • 1970-01-01
        相关资源
        最近更新 更多