IOS UIButton (DLRadioButton) 高度不依赖于标题标签文本大小

IOS UIButton (DLRadioButton) height doesn't depend on title label text size

我有 3 个单选按钮 DLRadioButton(UIButton 继承者)。 它们一个接一个地放在一起。

我希望按钮高度增加是标题标签高度增加。我设置行数 = 0:

    btn1.titleLabel?.numberOfLines = 0
    btn2.titleLabel?.numberOfLines = 0
    btn3.titleLabel?.numberOfLines = 0

根据需要获取尽可能多的行。但它最多只能工作 2 行。如果文本大小很大,按钮高度不会增加并且标签会重叠。

我该如何解决?

您需要编辑 DLRadioButton class 的来源。

这是一个快速示例更改。

注意:此更改仅适用于具有多行按钮标签的左侧图标位置。右图标位置仍然适用于单行按钮。

DLRadioButton.m库源中,添加这个方法:

- (CGSize)intrinsicContentSize {
    [self.titleLabel sizeToFit];
    CGSize sz = self.titleLabel.bounds.size;
    sz.height += self.titleEdgeInsets.top + self.titleEdgeInsets.bottom;
    sz.width += self.icon.size.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right + self.marginWidth;
    return sz;
}

然后您可以像这样布置您的按钮(或者从代码生成它们,没关系):

和示例 Swift 视图控制器代码:

class MultilineViewController: UIViewController {

    @IBOutlet var qTitle: UILabel!
    @IBOutlet var button1: DLRadioButton!
    @IBOutlet var button2: DLRadioButton!
    @IBOutlet var button3: DLRadioButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        for btn in [button1, button2, button3] {
            btn?.titleLabel?.lineBreakMode = .byWordWrapping
        }
    }

}

对于这个结果(我刚刚在示例应用程序的标签栏中添加了另一个 VC):

"radio button circle" 将垂直居中放置。如果您希望它与文本的第一行对齐,则需要进行一些额外的编辑。

如果您不想使用此 DLRadioButton 库的其他功能(例如图标图像、右图标定位、多 select 复选框组等),您可以想查看其他实现(其中有很多)或编写自己的实现。

import DLRadioButton

class CustomDLRadioButton: DLRadioButton {
    override var intrinsicContentSize: CGSize {
        if let label = self.titleLabel {
            label.sizeToFit()
            var sz = label.bounds.size;
            sz.height += self.titleEdgeInsets.top + self.titleEdgeInsets.bottom
            sz.width += self.icon.size.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right + self.marginWidth
            return sz
        }
        return CGSize.zero
    }
}

let button = CustomDLRadioButton()
button.titleLabel?.lineBreakMode = .byWordWrapping

这是已接受答案的 Swift 版本。您可以子类化 DLRadioButton 方法并覆盖 intrinsicContentSize 属性,它对我有用。