我有一个使用自定义按钮的应用程序,这些按钮应该仅具有背景图像。与其向所有按钮添加背景图像,不如说有一个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中调整按钮的大小以为图像留出空间,否则标题不会显示。即contentEdgeInsets属性和sizeToFit似乎没有影响
    我想这是一个非常基本的问题,但是我没有任何解决方案。有什么建议吗?

    根据与Matt的讨论编辑1:

    我想要达到的目的是在按钮标题周围留出一些空间。那是我对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不会“执行”代码中设置的背景图像,依此类推。

    10-08 12:32