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