多行文本高度的计算在开发过程中经常会用到,一般都是使用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
网友评论