将自定义UIButton样式应用于所有按钮
我想将一些样式应用于来自多个故事板的所有视图控制器。我有很多视图控制器,所以将样式应用于每个视图控制器听起来都很愚蠢。我希望尽可能以最精简的代码方式来完成。我正在考虑在AppDelegate文件中这样做,因为您也可以在那里更改导航控制器样式,但目前为止没有成功。甚至丝毫没有。将自定义UIButton样式应用于所有按钮
那么有谁知道我该怎么做?
我正在使用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
一个子类,并提供所有的u想申请的造型,并确保您的按钮,从您的自定义类扩展
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:感谢您对重构代码:)非常感谢 –
欢迎您是团队合作:) – Lamar
您可以使用UIA外观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制作自定义类。所以你可以从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()
}
}
检查'UIAppearance' – JuicyFruit
你为什么不创建UIButton'的'子类,包含了所有这些风格属性,让你所有的按钮都使用该子类来代替'UIButton' – Lamar
@Lamar谢谢你,那将是最好的解决方案。 –