【问题标题】:IOS UIButton (DLRadioButton) height doesn't depend on title label text sizeIOS UIButton (DLRadioButton) 高度不依赖于标题标签文本大小
【发布时间】:2020-07-18 18:04:04
【问题描述】:

我有 3 个单选按钮 DLRadioButton(UIButton 继承者)。 它们位于另一个之下。

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

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

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

我该如何解决?

【问题讨论】:

  • 您是否为按钮设置了高度限制或将它们嵌入到固定高度的 stackView 中??
  • 要使用 DLRadioButton 库,您需要为您的单选按钮指定明确的高度,或者根据自动布局生成的 titleLabel 大小编辑源代码以返回 intrinsicContentSize .
  • @DonMag 我试过这个:覆盖 var intrinsicContentSize: CGSize { self.titleLabel?.lineBreakMode = .byClipping var btnSize = self.titleLabel!.sizeThatFits(CGSize(width: super.intrinsicContentSize.width, height : 10000)) btnSize.width = super.intrinsicContentSize.width return btnSize } 但它不起作用。我认为 sizeThatFits 返回的高度小于高度。文本。

标签: ios swift uibutton autolayout storyboard


【解决方案1】:

您需要编辑DLRadioButton 类的源代码。

这是一个快速的示例更改。

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

在库源的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):

“单选按钮圆圈”将垂直居中放置。如果您希望它与文本的第一行对齐,则需要进行一些额外的编辑。

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

【讨论】:

  • 非常感谢您提供如此详细的答复。我解决了这个问题: let lbl = UILabel() lbl.numberOfLines = 0 lbl.font = UIFont.systemFont(ofSize: 12) // 确保你设置正确 lbl.text = "我的文本可能会也可能不会换行..." let width = 100.0 // 约束视图的宽度,记住此处应用的任何边距 let height = lbl.systemLayoutSizeFitting(CGSize(width: width, height: UIView.layoutFittingCompressedSize.height), withHorizo​​ntalFittingPriority : .required, verticalFittingPriority: .fittingSizeLevel).height 这种方式正确吗?
【解决方案2】:
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 属性,它适用于我。

【讨论】:

    猜你喜欢
    • 2016-04-07
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多