我在ios中创建了一个自定义UIButton
。我想使用相同的自定义按钮十次具有相同的属性但不同的标题。如果不为每个按钮重复相同的代码,最有效和最聪明的方法是什么?它应该是结构,类还是别的什么?我该如何实现它?我为自定义按钮更改的属性如下:
@IBOutlet weak var button_1: UIButton!
button_1.frame = CGRectMake(0.0, 0.0, button_1.frame.width, button_1.frame.height)
button_1.clipsToBounds = true
button_1.layer.cornerRadius = button_1.frame.width/2.0
button_1.layer.borderColor = UIColor.whiteColor().CGColor
button_1.layer.borderWidth=2.0
答案 0 :(得分:7)
您可以创建自己的类,其范围为UIButton
@IBDesignable
class MyOwnButton: UIButton {
var borderWidth = 2.0
var boderColor = UIColor.whiteColor().CGColor
@IBInspectable
var titleText: String? {
didSet {
self.setTitle(titleText, forState: .Normal)
self.setTitleColor(UIColor.blackColor(), forState: .Normal)
}
}
override init(frame: CGRect){
super.init(frame: frame)
}
required init?(aDecoder: NSCoder) {
super.init(aDecoder: aDecoder)
}
override func layoutSubviews() {
setup()
}
func setup() {
self.clipsToBounds = true
self.layer.cornerRadius = self.frame.size.width / 2.0
self.layer.borderColor = borderColor
self.layer.borderWidth = borderWidth
}
要为按钮设置文字,只需写下myButton.titleText = "myText"
。
然后,您可以从界面构建器中拖放UIButton
,然后将该按钮的类更改为您自己的MyOwnButton
,或者通过代码创建一个。
答案 1 :(得分:4)
您需要像这样extension
创建UIButton
extension UIButton {
class func attributedButton(frame: CGRect) -> UIButton {
let button = UIButton(frame: frame)
button.clipsToBounds = true
button.layer.cornerRadius = button_1.frame.width/2.0
button.layer.borderColor = UIColor.whiteColor().CGColor
button.layer.borderWidth = 2.0
return button
}
}
现在以这种方式调用此方法
let button = UIButton.attributedButton(frame: CGRectMake(20, 20, 10, 40)
button.setTitle("Title", forState: .Normal)
self.view.addSubview(button)
现在,每次要创建具有这些固定属性的按钮时,都可以使用此方法。
答案 2 :(得分:0)
问题作者标记了正确的答案(作者:准将),但是在swift 4中可能无法正常工作(也许在其他版本中,尚未检查)。 例如,当我设置按钮标题时,它不会在运行时显示。原因如下:它不称为super.layoutSubviews()。
正确的方法在这里:
@IBDesignable
class MyOwnButton: UIButton {
var borderWidth = 2.0
var boderColor = UIColor.whiteColor().CGColor
@IBInspectable
var titleText: String? {
didSet {
self.setTitle(titleText, forState: .Normal)
self.setTitleColor(UIColor.blackColor(), forState: .Normal)
}
}
override init(frame: CGRect){
super.init(frame: frame)
}
required init?(aDecoder: NSCoder) {
super.init(aDecoder: aDecoder)
}
override func layoutSubviews() {
super.layoutSubviews()
setup()
}
func setup() {
self.clipsToBounds = true
self.layer.cornerRadius = self.frame.size.width / 2.0
self.layer.borderColor = borderColor
self.layer.borderWidth = borderWidth
}
}
答案 3 :(得分:0)