【问题标题】:Subclassing UIButton and make it IBDesignable子类化 UIButton 并使其成为 IBDesignable
【发布时间】:2015-06-28 20:03:19
【问题描述】:

我有一个使用自定义按钮的应用,这些按钮应该只是有一个背景图片。我宁愿拥有一个 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

两个问题:

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

我想这是一个非常基本的问题,但我无法解决。有什么建议吗?

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

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

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

【问题讨论】:

    标签: ios swift uibutton subclass ibdesignable


    【解决方案1】:

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

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

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

    self.backgroundColor = UIColor.redColor()
    

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

    【讨论】:

    • 我尝试添加一个简单的 intrinsicContentSize 函数返回一个常量大小;该函数被调用,但按钮未调整大小。我会尝试使用 sizeToFit。
    • 嗯,它不会在 IB 中调整大小。我在建议应用程序运行时如何处理它...
    • 嗯,可能是因为您没有使用自动布局。实施intrinsicContentSize 确实对我有用。
    • 我正在使用自动布局,或者至少我是这么认为的。你能发布你的完整代码吗?
    • 实现sizeToFit 也不起作用。看起来按钮的大小固定为 IB 中设置的任何内容。我在这里想念的东西一定很愚蠢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    相关资源
    最近更新 更多