多行文本高度的計算在開發(fā)過程中經(jīng)常會用到,一般都是使用boundingRect(with:options:attributes:)方法來計算高度。
// 根據(jù)字體計算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,如果想要高度自適應(yīng),就傳CGFloat(MAXFLOAT),寬度為label的寬度
lineBreak:這個要和label的lineBreakModel一樣,計算才會準(zhǔn)確
在使用的時候,會發(fā)現(xiàn)在計算中英混合字符串的時候會不準(zhǔn)確。這個是label的lineBreakModel失效引起的,只需要在賦值后再設(shè)置一次lineBreakModel屬性就可以了。
label.attributedText = NSAttributedString(string: "備注: \(notes)", attributes: nil)
label.lineBreakMode = .byCharWrapping