将自定义 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