对UIButton进行子类化并使其成为IBDesignable

时间:2015-06-28 20:03:20

标签: 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似乎没有效果
  3. 我想这是一个非常基本的问题,但我无法解决任何问题。有什么建议吗?

    根据以下Matt的讨论编辑1:

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

    enter image description here

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

    enter image description here

1 个答案:

答案 0 :(得分:3)

你误解了count的作用。对于背景图像的插图,您需要实现此方法:

count-1

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

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

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

相关问题