子类化 UIButton 并使其成为 IBDesignable
Subclassing UIButton and make it IBDesignable
我有一个使用自定义按钮的应用程序,按钮应该只有一个背景图像。我宁愿有一个 UIButton 子类,而不是将背景图像添加到所有按钮。如果自定义按钮也能在 Interface Builder 中正确呈现,那就太好了。这是我目前的尝试:
import UIKit
@IBDesignable
class STACPatientButton: UIButton {
override init(frame: CGRect) {
NSLog("initWithFrame");
super.init(frame: frame)
_setup()
}
required init(coder: NSCoder) {
NSLog("initWithCoder");
super.init(coder: coder)
_setup()
}
override func prepareForInterfaceBuilder() {
_setup()
}
private func _setup() {
if let image = UIImage(named:"patientButton.png") {
let insets = UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0)
let strechableImage = image.resizableImageWithCapInsets(insets)
self.setBackgroundImage(strechableImage, forState: UIControlState.Normal)
self.contentEdgeInsets = UIEdgeInsetsMake(16.0, 16.0, 16.0, 16.0)
self.sizeToFit()
}
}
}
这是哪里 patientButton.png
两个问题:
- 按钮在 Interface Builder 中无法正确呈现。它只是显示为系统按钮
- 标题不会显示,除非我在 Interface Builder 中调整按钮的大小以允许 space 显示图像;即
contentEdgeInsets
属性 和 sizeToFit
似乎没有效果
我想这是一个非常基本的问题,但我无法解决。有什么建议吗?
根据下面与 Matt 的讨论编辑 1:
我想要实现的是在按钮标题周围添加一些 space。那是我对 contentEdgeInsets
的理解,但看起来我错了。没有 contentEdgeInsets
这是按钮的呈现
这看起来很可怕。我想以编程方式获得这样的东西,而不必在 IB
中调整按钮的大小
您误解了 contentEdgeInsets
的作用。对于你的背景图片的插入,你需要实现这个方法:
override func backgroundRectForBounds(bounds: CGRect) -> CGRect {
return bounds.rectByInsetting(dx: 16, dy: 16)
}
对于 IBDesignable,您所做的在结构上是正确的;如果您删除 _setup()
代码并将其替换为
self.backgroundColor = UIColor.redColor()
该按钮在 IB 中实际上是红色的。所以也许 IB 只是没有 "do" 在代码中设置背景图片等等。
我有一个使用自定义按钮的应用程序,按钮应该只有一个背景图像。我宁愿有一个 UIButton 子类,而不是将背景图像添加到所有按钮。如果自定义按钮也能在 Interface Builder 中正确呈现,那就太好了。这是我目前的尝试:
import UIKit
@IBDesignable
class STACPatientButton: UIButton {
override init(frame: CGRect) {
NSLog("initWithFrame");
super.init(frame: frame)
_setup()
}
required init(coder: NSCoder) {
NSLog("initWithCoder");
super.init(coder: coder)
_setup()
}
override func prepareForInterfaceBuilder() {
_setup()
}
private func _setup() {
if let image = UIImage(named:"patientButton.png") {
let insets = UIEdgeInsetsMake(8.0, 8.0, 8.0, 8.0)
let strechableImage = image.resizableImageWithCapInsets(insets)
self.setBackgroundImage(strechableImage, forState: UIControlState.Normal)
self.contentEdgeInsets = UIEdgeInsetsMake(16.0, 16.0, 16.0, 16.0)
self.sizeToFit()
}
}
}
这是哪里 patientButton.png
两个问题:
- 按钮在 Interface Builder 中无法正确呈现。它只是显示为系统按钮
- 标题不会显示,除非我在 Interface Builder 中调整按钮的大小以允许 space 显示图像;即
contentEdgeInsets
属性 和sizeToFit
似乎没有效果
我想这是一个非常基本的问题,但我无法解决。有什么建议吗?
根据下面与 Matt 的讨论编辑 1:
我想要实现的是在按钮标题周围添加一些 space。那是我对 contentEdgeInsets
的理解,但看起来我错了。没有 contentEdgeInsets
这是按钮的呈现
这看起来很可怕。我想以编程方式获得这样的东西,而不必在 IB
中调整按钮的大小您误解了 contentEdgeInsets
的作用。对于你的背景图片的插入,你需要实现这个方法:
override func backgroundRectForBounds(bounds: CGRect) -> CGRect {
return bounds.rectByInsetting(dx: 16, dy: 16)
}
对于 IBDesignable,您所做的在结构上是正确的;如果您删除 _setup()
代码并将其替换为
self.backgroundColor = UIColor.redColor()
该按钮在 IB 中实际上是红色的。所以也许 IB 只是没有 "do" 在代码中设置背景图片等等。