将自定义 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
}
}
这样您所有的按钮都会有相同的外观。
希望对你有帮助
我想对来自多个故事板的所有 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
}
}
这样您所有的按钮都会有相同的外观。 希望对你有帮助