计算包含HTML的NSAttributedString的高度

时间:2017-06-02 06:36:44

标签: ios swift swift3 frame cgrect

我使用NSAttributedString使用以下代码显示HTML文本。

do {
    let html = "<span style=\"font-family: Montserrat-ExtraLight; font-size: 14; line-height: 1.5;\">\(clinic.profile!)</span>"
    let clinicProfile = try NSAttributedString(
        data: (html.data(using: String.Encoding.unicode, allowLossyConversion: true)!),
        options: [
            NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType
        ],
        documentAttributes: nil
    )
    contentView.attributedText = clinicProfile
    scrollView.addSubview(contentView)
} catch {
    print(error)
}

我现在想要计算字符串的高度,在HTML中,我使用的是p, strong, em, ul > li, ol > li.

等HTML标记

我尝试了以下代码。

let size = CGSize(width: view.frame.width, height: 2000)
let boundingBox = contentView.attributedText.boundingRect(
    with: size,
    options: [.usesLineFragmentOrigin, .usesFontLeading, .usesDeviceMetrics],
    context: nil
)
print(boundingBox.height)

这会返回462,它比实际高度小,如何正确计算这个高度?

感谢。

2 个答案:

答案 0 :(得分:2)

我的解决方案确实有效,问题是我错误地设置了scrollview的大小,修复滚动视图的高度解决了我的问题。

let size = CGSize(width: view.frame.width, height: 2000)
let boundingBox = contentView.attributedText.boundingRect(
    with: size,
    options: [.usesLineFragmentOrigin, .usesFontLeading, .usesDeviceMetrics],
    context: nil
)
print(boundingBox.height)

答案 1 :(得分:-1)

调用此方法,您需要标签的动态高度

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat
{
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()

return label.frame.height
}