ios - 子类化 UIButton 并使其成为 IBDesignable

标签 ios swift uibutton subclass 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 的位置

enter image description here

两个问题:

  1. 按钮无法在 Interface Builder 中正确呈现。它只是显示为系统按钮
  2. 标题不会显示,除非我在 Interface Builder 中调整按钮的大小以便为图像留出空间;即,contentEdgeInsets 属性和 sizeToFit 似乎没有效果

我想这是一个非常基本的问题,但我找不到任何解决方案。有什么建议吗?

根据下面与 Matt 的讨论编辑 1:

我想要实现的是在按钮标题周围留出一些空间。那是我对 contentEdgeInsets 的理解,但看起来我错了。没有 contentEdgeInsets 这是按钮的渲染

enter image description here

这看起来很可怕。我想以编程方式获得这样的东西,而不必在 IB 中调整按钮的大小

enter image description here

最佳答案

您误解了 contentEdgeInsets 的作用。对于背景图片的插入,您需要实现此方法:

override func backgroundRectForBounds(bounds: CGRect) -> CGRect {
    return bounds.rectByInsetting(dx: 16, dy: 16)
}

对于 IBDesignable,您所做的在结构上是正确的;如果您删除 _setup() 代码并将其替换为

self.backgroundColor = UIColor.redColor()

按钮在 IB 中实际上是红色的。所以也许 IB 只是不“做”在代码中设置背景图像等等。

关于ios - 子类化 UIButton 并使其成为 IBDesignable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104195/

相关文章:

ios - 如何读取Progress View的值?

ios - 自定义 UIButton - IBAction 不工作

ios - Objective C 中的 Nil 委托(delegate)

ios - 快速自定义右转

iphone - UIVIew block 动画后用户交互中断

ios - UIButton.isSelected 不能 Observable

ios - 防止在表格 View Swift 中重用自定义单元格

iOS MVC : get view controller class from model?

ios - 从 firebase 数据库更新数组值

ios - cellForRowAtIndexPath 问题