首页 > 解决方案 > 在 Swift 中随着文本大小的增加而增加按钮的高度

问题描述

我对自动布局很陌生,我一直在努力解决一件事。

在此处输入图像描述

在- 我试图根据文本大小增加它的高度Roll btnBottomView如您所见,textlabelbtn 的高度在增加,但 btn的高度height没有。

constraints我申请的:

1)Horizontalllyverticallly以superview为中心

2)Leadingtrailing来自superview

3)我尝试将高度约束也设置greaterThanEqualToconstant。但这没有用

4)我也试过了SizeToFit。没用

5)我已将链接设置lineBreak为0。仍然无法正常WordWrap工作number of linestitleLabel

标签: iosswiftxcode

解决方案


当您修改.titleLabelaUIButton时,自动布局不会考虑您的更改。

要获得正确自动调整大小的多行按钮,您需要对其进行子类化并返回一个有效的.intrinsicContentSize.

这是一个简单的例子:

@IBDesignable
class MultilineButton: UIButton {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        commonInit()
        setNeedsLayout()
    }

    func commonInit() -> Void {
        self.titleLabel?.numberOfLines = 0
        self.titleLabel?.textAlignment = .center
        self.contentEdgeInsets = UIEdgeInsets(top: 8.0, left: 8.0, bottom: 8.0, right: 8.0)
    }

    override var intrinsicContentSize: CGSize {
        let size = self.titleLabel!.intrinsicContentSize
        return CGSize(width: size.width + contentEdgeInsets.left + contentEdgeInsets.right, height: size.height + contentEdgeInsets.top + contentEdgeInsets.bottom)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        titleLabel?.preferredMaxLayoutWidth = self.titleLabel!.frame.size.width
    }

}

该类已标记@IBDesignable,因此您可以在 Storyboard / Interface Builder 中使用它以获得准确的结果。

这是此按钮的 3 个实例的外观(在 Storyboard 中)。首先是一个简短的标题,所以它不需要换行;下一个带有换行的标题;第三个带有嵌入换行符的标题:

在此处输入图像描述

请注意,此示例Content Edge Insets在所有 4 条边上明确地将 设置为 8-pts。如果您希望能够为单个按钮更改它,则需要进行一些编辑。


推荐阅读