UILabel多行文本高度计算

2019/8/6 posted in  Swift

多行文本高度的计算在开发过程中经常会用到,一般都是使用boundingRect(with:options:attributes:)方法来计算高度。

// 根据字体计算size
func size(drawIn size: CGSize, font: UIFont, options: NSStringDrawingOptions = .usesLineFragmentOrigin, lineBreak: NSLineBreakMode = .byCharWrapping) -> CGSize {
    let paragraph = NSMutableParagraphStyle()
    paragraph.lineBreakMode = lineBreak
    let dic = [NSAttributedStringKey.font: font, NSAttributedStringKey.paragraphStyle: paragraph]
    let bounds = NSAttributedString(string: self, attributes: dic).boundingRect(with: size, options: options, context: nil)
    return bounds.size
}

size: label的size,如果想要高度自适应,就传CGFloat(MAXFLOAT),宽度为label的宽度
lineBreak:这个要和label的lineBreakModel一样,计算才会准确

在使用的时候,会发现在计算中英混合字符串的时候会不准确。这个是label的lineBreakModel失效引起的,只需要在赋值后再设置一次lineBreakModel属性就可以了。

label.attributedText = NSAttributedString(string: "备注: \(notes)", attributes: nil)
label.lineBreakMode = .byCharWrapping